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:
- Mehrere Durchschnitte über gleichmäßig verteilte Intervalle
- Aggregation (x, y) Koordinatenpunktwolken in PostgreSQL