В Postgres , width_bucket()
е точно това, което търсите - да гранулирате произволен брой редове (N
) в основната таблица в даден (за предпочитане по-малък ) брой точки с данни (n
). Можете да добавите броя на редовете, допринасящи за всяка точка от данни, за да обозначите теглото.
Едно незначително препятствие:Вариантът на width_bucket()
трябва да работи с double precision
или numeric
числа, а не на timestamp
et al. Просто извлечете епохата за работа.
Приемайки тази дефиниция на таблица и текуща версия на Postgres:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, value numeric NOT NULL
, created_at timestamptz NOT NULL
);
Заявка:
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;
Резултат:
pix | avg | weight
----+--------+------
1 | 152.58 | 7
2 | 155.16 | 8
3 | 148.89 | 7
...
Връща 400 реда - освен ако N
<n
, в който случай получавате N
редове.
Свързани:
- Множество средни стойности за равномерно разпределени интервали
- Агрегиране (x, y) координатни облаци от точки в PostgreSQL