Dans Postgres , width_bucket()
est exactement ce que vous recherchez - pour granuler n'importe quel nombre de lignes (N
) dans la table sous-jacente dans une donnée (de préférence plus petite ) nombre de points de données (n
). Vous pouvez ajouter le nombre de lignes contribuant à chaque point de données pour indiquer le poids.
Un obstacle mineur :la variante de width_bucket()
nous avons besoin d'opérer sur la double precision
ou numeric
numéros, pas sur timestamp
et coll. Extrayez simplement l'époque travailler avec.
En supposant cette définition de table et une version actuelle de Postgres :
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, value numeric NOT NULL
, created_at timestamptz NOT NULL
);
Requête :
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;
Résultat :
pix | avg | weight
----+--------+------
1 | 152.58 | 7
2 | 155.16 | 8
3 | 148.89 | 7
...
Renvoie 400 lignes - sauf si N
<n
, auquel cas vous obtenez N
lignes.
Connexe :
- Plusieurs moyennes sur des intervalles régulièrement espacés
- Agrégation (x, y) coordonner les nuages de points dans PostgreSQL