En Postgres , width_bucket()
es justo lo que está buscando:granular cualquier número de filas (N
) en la tabla subyacente en un dado (preferiblemente más pequeño ) número de puntos de datos (n
). Puede agregar el recuento de filas que contribuyen a cada punto de datos para indicar el peso.
Un obstáculo menor:la variante de width_bucket()
necesitamos operaciones en double precision
o numeric
números, no en timestamp
et al. Simplemente extraiga la época para trabajar.
Asumiendo esta definición de tabla y una versión actual de Postgres:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, value numeric NOT NULL
, created_at timestamptz NOT NULL
);
Consulta:
SELECT width_bucket(extract(epoch FROM t.created_at), x.min_epoch, x.max_epoch, 400) AS pix
, round(avg(t.value), 2) AS avg -- round is optional
, count(*) AS weight
FROM big t
CROSS JOIN (SELECT extract(epoch FROM min(created_at)) AS min_epoch
, extract(epoch FROM max(created_at)) AS max_epoch FROM big) x
GROUP BY 1
ORDER BY 1;
Resultado:
pix | avg | weight
----+--------+------
1 | 152.58 | 7
2 | 155.16 | 8
3 | 148.89 | 7
...
Devuelve 400 filas, a menos que N
<n
, en cuyo caso obtienes N
filas.
Relacionado:
- Promedios múltiples en intervalos uniformemente espaciados
- Agregación (x, y) coordenadas de nubes de puntos en PostgreSQL