Heim > Datenbank > MySQL-Tutorial > Wie finde ich die nächste Aktivität der Gruppe B, die den Aktivitäten der Gruppe A in PostgreSQL folgt?

Wie finde ich die nächste Aktivität der Gruppe B, die den Aktivitäten der Gruppe A in PostgreSQL folgt?

Barbara Streisand
Freigeben: 2025-01-01 07:17:08
Original
1006 Leute haben es durchsucht

How to Find the Next Activity of Group B Following Group A Activities in PostgreSQL?

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

Diese Abfrage verwendet eine Unterabfrage, um:

  1. DISTINCT zu verwenden ON (Name), um die neueste Aktivität (a1) aus Gruppe A für jeden Benutzer zu identifizieren.
  2. Wenden Sie „lead()“ an, um die nächste Aktivität (a2) für jede Zeile zu erhalten.
  3. Verwenden Sie CASE und LIKE 'B%', um die nächste Aktivität zu erkennen und zuzuweisen, wenn sie zur Gruppe B gehört.

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

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!

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