No Postgres ,
width_bucket()
é exatamente o que você está procurando - para granular qualquer número de linhas (N
) na tabela subjacente em um determinado (de preferência menor ) número de pontos de dados (n
). Você pode adicionar a contagem de linhas que contribuem para cada ponto de dados para significar o peso. Um pequeno obstáculo:A variante de
width_bucket()
que precisamos opera em double precision
ou numeric
números, não em timestamp
et ai. Basta extrair a época trabalhar com. Assumindo esta definição de tabela e uma versão atual do Postgres:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, value numeric NOT NULL
, created_at timestamptz NOT NULL
);
Consulta:
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;
Resultado:
pix | avg | weight
----+--------+------
1 | 152.58 | 7
2 | 155.16 | 8
3 | 148.89 | 7
...
Retorna 400 linhas - a menos que
N
<n
, nesse caso você obtém N
linhas. Relacionado:
- Várias médias em intervalos uniformemente espaçados
- Agregar (x, y) coordenar nuvens de pontos no PostgreSQL