Postgres 、 width_bucket()
探しているのは、任意の数の行を細分化することです(N
)基になるテーブル内の特定の(できれば小さい )データポイントの数(n
)。重みを示すために、各データポイントに寄与する行数を追加できます。
1つの小さな障害:width_bucket()
のバリアント double precision
で動作する必要があります またはnumeric
timestamp
ではなく数字 etal。 エポックを抽出するだけです 一緒に作業します。
このテーブル定義と現在の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
...
N
でない限り、400行を返します <n
、この場合、N
を取得します 行。
関連: