PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie reduziert man die Ergebniszeilen der SQL-Abfrage gleichmäßig im gesamten Bereich?

In Postgres , width_bucket() ist genau das Richtige für Sie - um beliebig viele Zeilen zu granulieren (N ) in der zugrunde liegenden Tabelle in eine vorgegebene (vorzugsweise kleinere ) Anzahl Datenpunkte (n ). Sie können die Anzahl der Zeilen hinzufügen, die zu jedem Datenpunkt beitragen, um die Gewichtung anzugeben.

Ein kleines Hindernis:Die Variante von width_bucket() Wir brauchen Operationen mit double precision oder numeric Nummern, nicht auf timestamp et al. Extrahieren Sie einfach die Epoche zu arbeiten.

Angenommen diese Tabellendefinition und eine aktuelle Postgres-Version:

CREATE TABLE tbl (
  tbl_id serial PRIMARY KEY
, value  numeric NOT NULL
, created_at timestamptz NOT NULL
);

Abfrage:

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;

Ergebnis:

pix | avg    | weight
----+--------+------
1   | 152.58 | 7
2   | 155.16 | 8
3   | 148.89 | 7
...

Gibt 400 Zeilen zurück - außer N <n , in diesem Fall erhalten Sie N Zeilen.

Verwandte: