Sonidos como una aplicación para funciones de ventana . Pero, lamentablemente, ese no es el caso. Los marcos de las ventanas solo se pueden basar en el recuento de filas, no en los valores reales de las columnas.
Una consulta simple con LEFT JOIN
puede hacer el trabajo:
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 aquí
No funciona con time
como en su demostración mínima, ya que eso no termina. Supongo que es razonable asumir timestamp
o timestamptz
.
Dado que incluye cada fila en el recuento, un INNER JOIN
también funcionaría. (LEFT JOIN
es aún más fiable frente a posibles valores NULL.)
O usa un LATERAL
subconsulta y no necesita agregar en el nivel de consulta externo:
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 tablas grandes y muchas filas en el marco de tiempo, una solución de procedimiento que recorre la tabla una vez rendirá mejor. Me gusta:
- Funciones de ventana o expresiones de tabla comunes:cuente las filas anteriores dentro del rango
- Alternativas a PL/ruby rotos:convertir una tabla de diario de almacén
- AGRUPAR POR y agregar valores numéricos secuenciales