In Postgres , width_bucket()
is precies wat u zoekt - om een willekeurig aantal rijen te granuleren (N
) in de onderliggende tabel in een gegeven (bij voorkeur kleiner ) aantal datapunten (n
). U kunt het aantal rijen dat bijdraagt aan elk gegevenspunt toevoegen om het gewicht aan te geven.
Een klein obstakel:de variant van width_bucket()
we moeten werken op double precision
of numeric
cijfers, niet op timestamp
et al. Pak gewoon het tijdperk . uit om mee te werken.
Uitgaande van deze tabeldefinitie en een huidige Postgres-versie:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, value numeric NOT NULL
, created_at timestamptz NOT NULL
);
Vraag:
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;
Resultaat:
pix | avg | weight
----+--------+------
1 | 152.58 | 7
2 | 155.16 | 8
3 | 148.89 | 7
...
Retourneert 400 rijen - tenzij N
<n
, in welk geval je N
. krijgt rijen.
Gerelateerd:
- Meerdere gemiddelden over gelijkmatig verdeelde intervallen
- Aggregatie (x, y) coördineer puntenwolken in PostgreSQL