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?