Bedingte Lead/Lag-Funktion in PostgreSQL
Sie haben eine Tabelle mit Aktivitäten für verschiedene Benutzer und Zeitstempeln. Sie möchten für jeden Benutzer die letzte Aktivität aus Gruppe A identifizieren und dann gegebenenfalls die nachfolgende Aktivität aus Gruppe B ermitteln.
Verwenden der Lead-Funktion
Zunächst Sie habe versucht, die Funktion „lead()“ zu verwenden, um dieses Problem zu lösen. Allerdings reicht die Funktion „lead()“ allein für diese Aufgabe nicht aus, da sie einfach den nächsten Wert in der Reihenfolge abruft, unabhängig von etwaigen Bedingungen.
Bedingte Fensterfunktionen (FILTER)
Um Bedingungen effektiv auf Fensterfunktionen anzuwenden, bietet PostgreSQL die FILTER-Klausel an. Leider ist diese Klausel derzeit nicht für echte Fensterfunktionen wie Lead() und Lag() implementiert, da sie nur für Aggregatfunktionen verfügbar ist.
Alternative Lösung mit DISTINCT ON
Um diese Herausforderung ohne FILTER anzugehen, können wir eine Kombination aus DISTINCT ON- und CASE-Anweisungen zusammen mit einer Unterabfrage verwenden:
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;
Dieser Ansatz nutzt die DISTINCT ON-Klausel, um Zeilen nach Benutzer zu gruppieren und für jeden Benutzer die letzte qualifizierende Aktivität aus Gruppe A auszuwählen. Die CASE-Anweisungen werden verwendet, um die geeignete Aktivität und die nachfolgende Aktivität basierend auf den angegebenen Bedingungen zu bestimmen.
Optimale Lösung für große Datensätze
Für Fälle mit einer großen Anzahl von Zeilen Pro Benutzer können alternative Techniken effizienter sein. Diese Techniken umfassen typischerweise die Erstellung temporärer Tabellen oder die Verwendung erweiterter Indizierungsstrategien. Der optimale Ansatz kann jedoch je nach den spezifischen Merkmalen Ihrer Daten und Arbeitslast variieren.
Das obige ist der detaillierte Inhalt vonWie kann ich die nachfolgende Aktivität aus Gruppe B nach der letzten Aktivität aus Gruppe A in PostgreSQL finden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!