sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo reducir las filas de resultados de la consulta SQL por igual en el rango completo?

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: