Isso faria isso:
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;
A subconsulta
sub
registra step
como true
se a linha anterior estiver a pelo menos 2 minutos - classificada pela coluna timestamp done
próprio neste caso. A consulta externa adiciona uma contagem contínua de etapas, efetivamente o número do grupo (
grp
) - combinando o agregado FILTER
cláusula com outra função de janela. db<>mexa aqui
Relacionado:
- Consulte para encontrar todos os timestamps separados por um determinado intervalo
- Como rotular grupos no postgresql quando o pertencimento ao grupo depende da linha anterior?
- Selecione a sequência contínua mais longa
- Agrupamento ou janela
Sobre o agregado
FILTER
cláusula:- Como posso simplificar esta consulta de estatísticas de jogo?
- Função condicional de lead/lag PostgreSQL?