PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como agrupar carimbos de data/hora em ilhas (com base em lacunas arbitrárias)?


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?