PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment réduire les lignes de résultats d'une requête SQL de manière égale dans toute la plage ?

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 :