PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como reduzir as linhas de resultado da consulta SQL igualmente em toda a gama?


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: