PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come raggruppare i timestamp in isole (basato su un divario arbitrario)?

Questo lo farebbe:

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;

La sottoquery sub registra il step come true se la riga precedente è ad almeno 2 minuti di distanza, ordinata in base alla colonna timestamp done stesso in questo caso.

La query esterna aggiunge un conteggio progressivo di passaggi, in effetti il ​​numero del gruppo (grp ) - combinando l'aggregato FILTER clausola con un'altra funzione della finestra.

db<>gioca qui

Correlati:

  • Query per trovare tutti i timestamp a più di un certo intervallo di distanza
  • Come etichettare i gruppi in postgresql quando l'appartenenza al gruppo dipende dalla riga precedente?
  • Seleziona la sequenza continua più lunga
  • Raggruppamento o finestra

Informazioni sull'aggregato FILTER clausola:

  • Come posso semplificare questa query sulle statistiche di gioco?
  • Funzione di anticipo/ritardo condizionale PostgreSQL?