I Postgres , width_bucket()
er lige det, du leder efter - at granulere et vilkårligt antal rækker (N
) i den underliggende tabel til en given (helst mindre ) antal datapunkter (n
). Du kan tilføje antallet af rækker, der bidrager til hvert datapunkt, for at angive vægt.
En mindre hindring:Varianten af width_bucket()
vi har brug for fungerer på double precision
eller numeric
tal, ikke på timestamp
et al. Udtræk bare epoken at arbejde med.
Forudsat denne tabeldefinition og en aktuel Postgres-version:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, value numeric NOT NULL
, created_at timestamptz NOT NULL
);
Forespørgsel:
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;
Resultat:
pix | avg | weight
----+--------+------
1 | 152.58 | 7
2 | 155.16 | 8
3 | 148.89 | 7
...
Returnerer 400 rækker - medmindre N
<n
, i så fald får du N
rækker.
Relateret:
- Flere gennemsnit over jævnt fordelte intervaller
- Aggregering (x, y) koordinere punktskyer i PostgreSQL