sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo agrupar marcas de tiempo en islas (basadas en una brecha arbitraria)?

Esto lo haría:

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 subconsulta sub registra step como true si la fila anterior está al menos a 2 minutos de distancia, ordenada por la columna de marca de tiempo done en este caso.

La consulta externa agrega un conteo continuo de pasos, efectivamente el número de grupo (grp ) - combinando el agregado FILTER cláusula con otra función de ventana.

db<>violín aquí

Relacionado:

  • Consulta para encontrar todas las marcas de tiempo separadas por más de un cierto intervalo
  • ¿Cómo etiquetar grupos en postgresql cuando la pertenencia al grupo depende de la línea anterior?
  • Seleccione la secuencia continua más larga
  • Agrupación o ventana

Acerca del agregado FILTER cláusula:

  • ¿Cómo puedo simplificar esta consulta de estadísticas del juego?
  • ¿Función de adelanto/retraso condicional de PostgreSQL?