W Postgresie , width_bucket()
jest właśnie tym, czego szukasz - granulować dowolną liczbę rzędów (N
) w tabeli bazowej na podany (najlepiej mniejszy ) liczba punktów danych (n
). Możesz dodać liczbę wierszy przyczyniających się do każdego punktu danych, aby określić wagę.
Jedna niewielka przeszkoda:wariant width_bucket()
potrzebujemy operować na double precision
lub numeric
numery, a nie na timestamp
i in. Po prostu wyodrębnij epokę do pracy.
Zakładając tę definicję tabeli i aktualną wersję Postgresa:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, value numeric NOT NULL
, created_at timestamptz NOT NULL
);
Zapytanie:
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;
Wynik:
pix | avg | weight
----+--------+------
1 | 152.58 | 7
2 | 155.16 | 8
3 | 148.89 | 7
...
Zwraca 400 wierszy - chyba że N
<n
, w takim przypadku otrzymasz N
wiersze.
Powiązane:
- Wiele średnich w równomiernie rozmieszczonych interwałach
- Agregacja (x, y) koordynuj chmury punktów w PostgreSQL