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

Contagem contínua de linhas dentro do intervalo de tempo


Sons como um aplicativo para funções de janela . Mas, infelizmente, esse não é o caso. Os quadros de janela só podem ser baseados em contagens de linhas, não em valores reais de coluna.

Uma consulta simples com LEFT JOIN pode fazer o trabalho:
SELECT t0.order_id
     , count(t1.time_created) AS count_within_3_sec
FROM   tbl      t0
LEFT   JOIN tbl t1 ON t1.time_created BETWEEN t0.time_created - interval '3 sec'
                                          AND t0.time_created
GROUP  BY 1
ORDER  BY 1;

db<>fiddle aqui

Não funciona com time como em sua demonstração mínima, pois isso não envolve. Suponho que seja razoável supor timestamp ou timestamptz .

Como você inclui cada linha na contagem, um INNER JOIN funcionaria também. (LEFT JOIN ainda é mais confiável em face de possíveis valores NULL.)

Ou use um LATERAL subconsulta e você não precisa agregar no nível de consulta externa:
SELECT t0.order_id
     , t1.count_within_3_sec
FROM   tbl t0
LEFT   JOIN LATERAL (
   SELECT count(*) AS count_within_3_sec
   FROM   tbl t1
   WHERE  t1.time_created BETWEEN t0.time_created - interval '3 sec'
                              AND t0.time_created
   ) t1 ON true
ORDER  BY 1;

Relacionado:

Para tabelas grandes e muitas linhas no período de tempo, uma solução procedural que percorre a tabela uma vez terá um desempenho melhor. Curti: