Bedingte Lead/Lag-Funktionen in PostgreSQL
Sie versuchen, die nächste Aktivität zu identifizieren, die von Benutzern der Gruppe B nach ihnen ausgeführt wird Ich habe eine Aktivität aus Gruppe A abgeschlossen. Im Wesentlichen müssen Sie für jeden Benutzer die erste nachfolgende Aktivität aus Gruppe B finden.
Ein Ansatz ist die Verwendung bedingte Fensterfunktionen. In PostgreSQL können FILTER-Klauseln jedoch nur auf Aggregatfunktionen innerhalb von Fensterfunktionen angewendet werden, nicht auf Kernfensterfunktionen wie „lead()“ oder „lag()“.
Daher besteht eine praktikable Lösung darin, ein DISTINCT ON-Konstrukt zu verwenden neben CASE- und Fensterfunktionen:
SELECT name , CASE WHEN a2 LIKE 'B%' THEN a1 ELSE a2 END AS activity , CASE WHEN a2 LIKE 'B%' THEN a2 END AS next_activity FROM ( SELECT DISTINCT ON (name) name , lead(activity) OVER (PARTITION BY name ORDER BY time DESC) AS a1 , activity AS a2 FROM t WHERE (activity LIKE 'A%' OR activity LIKE 'B%') ORDER BY name, time DESC ) sub;
Diese Abfrage verwendet eine Unterabfrage, um:
Alternativ für kleine Datensätze mit einer begrenzten Anzahl von Zeilen pro Benutzer kann die folgende Abfrage verwendet werden:
SELECT name , activity AS a1 , lead(activity) OVER (PARTITION BY name ORDER BY time DESC) AS next_activity FROM t WHERE (activity LIKE 'A%' OR activity LIKE 'B%') ORDER BY name, time DESC;
Diese Abfrage vereinfacht die Logik, indem direkt nach Aktivitäten der Gruppe A gesucht und die nachfolgende Aktivität unabhängig von ihrer Gruppenzugehörigkeit abgerufen wird.
Das obige ist der detaillierte Inhalt vonWie finde ich die nächste Aktivität der Gruppe B, die den Aktivitäten der Gruppe A in PostgreSQL folgt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!