Heim > Datenbank > MySQL-Tutorial > Wie kann ich die nachfolgende Aktivität aus Gruppe B nach der letzten Aktivität aus Gruppe A in PostgreSQL finden?

Wie kann ich die nachfolgende Aktivität aus Gruppe B nach der letzten Aktivität aus Gruppe A in PostgreSQL finden?

Barbara Streisand
Freigeben: 2024-12-28 05:31:10
Original
956 Leute haben es durchsucht

How Can I Find the Subsequent Activity from Group B After the Last Activity from Group A in PostgreSQL?

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;
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage