V Postgres , width_bucket()
je právě to, co hledáte - granulovat libovolný počet řádků (N
) v podkladové tabulce do dané (nejlépe menší). ) počet datových bodů (n
). Můžete přidat počet řádků přispívajících ke každému datovému bodu, abyste označili váhu.
Jedna menší překážka:Varianta width_bucket()
potřebujeme pracovat na double precision
nebo numeric
čísla, nikoli na timestamp
a kol. Stačí extrahovat epochu pracovat.
Za předpokladu této definice tabulky a aktuální verze Postgres:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, value numeric NOT NULL
, created_at timestamptz NOT NULL
);
Dotaz:
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;
Výsledek:
pix | avg | weight
----+--------+------
1 | 152.58 | 7
2 | 155.16 | 8
3 | 148.89 | 7
...
Vrátí 400 řádků – pokud není N
<n
, v takovém případě dostanete N
řádky.
Související:
- Vícenásobné průměry v rovnoměrně rozložených intervalech
- Agregace (x, y) koordinovat mračna bodů v PostgreSQL