PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come ridurre le righe dei risultati della query SQL in modo uguale nell'intero intervallo?

In Postgres , width_bucket() è proprio quello che stai cercando:granulare un numero qualsiasi di righe (N ) nella tabella sottostante in un dato (preferibilmente più piccolo ) numero di punti dati (n ). Puoi aggiungere il conteggio delle righe che contribuiscono a ciascun punto dati per indicare il peso.

Un piccolo ostacolo:la variante di width_bucket() abbiamo bisogno di operare su double precision o numeric numeri, non su timestamp et al. Basta estrarre l'epoca con cui lavorare.

Assumendo questa definizione di tabella e una versione corrente di Postgres:

CREATE TABLE tbl (
  tbl_id serial PRIMARY KEY
, value  numeric NOT NULL
, created_at timestamptz NOT NULL
);

Query:

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;

Risultato:

pix | avg    | weight
----+--------+------
1   | 152.58 | 7
2   | 155.16 | 8
3   | 148.89 | 7
...

Restituisce 400 righe - a meno che N <n , nel qual caso ottieni N righe.

Correlati: