PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie gruppiert man Zeitstempel in Inseln (basierend auf einer willkürlichen Lücke)?

Dies würde es tun:

SELECT done, count(*) FILTER (WHERE step) OVER (ORDER BY done) AS grp
FROM  (
   SELECT done
       , (lag(done) OVER (ORDER BY done) <= done - interval '2 min') AS step
   FROM   tbl
   ) sub
ORDER  BY done;

Die Unterabfrage sub zeichnet step auf als true wenn die vorherige Zeile mindestens 2 min entfernt ist - sortiert nach der Zeitstempelspalte done selbst in diesem Fall.

Die äußere Abfrage fügt eine fortlaufende Anzahl von Schritten hinzu, effektiv die Gruppennummer (grp ) - Kombinieren des Aggregats FILTER -Klausel mit einer anderen Fensterfunktion.

db<>hier fummeln

Verwandte:

  • Abfrage, um alle Zeitstempel zu finden, die mehr als ein bestimmtes Intervall voneinander entfernt sind
  • Wie beschriftet man Gruppen in Postgresql, wenn die Gruppenzugehörigkeit von der vorangehenden Zeile abhängt?
  • Längste fortlaufende Sequenz auswählen
  • Gruppierung oder Fenster

Über das Aggregat FILTER Klausel:

  • Wie kann ich diese Spielstatistikabfrage vereinfachen?
  • Bedingte Lead/Lag-Funktion PostgreSQL?