sql >> Database >  >> RDS >> PostgreSQL

Hoe tijdstempels in eilanden te groeperen (op basis van willekeurige tussenruimte)?

Dit zou het doen:

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;

De subquery sub records step als true als de vorige rij minstens 2 minuten verwijderd is - gesorteerd op de tijdstempelkolom done zichzelf in dit geval.

De buitenste query voegt een rollend aantal stappen toe, in feite het groepsnummer (grp ) - combineren van het geaggregeerde FILTER clausule met een andere vensterfunctie.

db<>viool hier

Gerelateerd:

  • Query om alle tijdstempels te vinden die meer dan een bepaald interval uit elkaar liggen
  • Hoe groepen in postgresql te labelen als het behoren tot een groep afhangt van de voorgaande regel?
  • Selecteer de langste aaneengesloten reeks
  • Groeperen of Venster

Over het totale FILTER clausule:

  • Hoe kan ik deze zoekopdracht met spelstatistieken vereenvoudigen?
  • Voorwaardelijke lead/lag-functie PostgreSQL?


  1. SQL*Plus hoe de tekstvariabele van de prompt te accepteren?

  2. PostgreSQL-taakverdeling en proxySQL-verbeteringen - ClusterControl 1.5

  3. Voltooi het proces om de tabel van de ene database naar de andere te kopiëren (export-import) in SQL Server

  4. CLOB-velden in bestanden dumpen?