Di Posgres , width_bucket()
adalah hal yang Anda cari - untuk menggranulasi sejumlah baris (N
) di tabel di bawahnya ke dalam tabel tertentu (sebaiknya lebih kecil ) jumlah titik data (n
). Anda dapat menambahkan jumlah baris yang berkontribusi pada setiap titik data untuk menandakan bobot.
Satu kendala kecil:Varian width_bucket()
kita perlu beroperasi pada double precision
atau numeric
angka, bukan di timestamp
dkk. Cukup ekstrak Epoch untuk bekerja dengan.
Dengan asumsi definisi tabel ini dan versi Postgres saat ini:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, value numeric NOT NULL
, created_at timestamptz NOT NULL
);
Kueri:
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;
Hasil:
pix | avg | weight
----+--------+------
1 | 152.58 | 7
2 | 155.16 | 8
3 | 148.89 | 7
...
Mengembalikan 400 baris - kecuali N
<n
, dalam hal ini Anda mendapatkan N
baris.
Terkait: