sql >> Databáze >  >> RDS >> PostgreSQL

Jak snížit výsledné řádky SQL dotazu rovnoměrně v plném rozsahu?

V Postgres , width_bucket() je právě to, co hledáte - granulovat libovolný počet řádků (N ) v podkladové tabulce do dané (nejlépe menší). ) počet datových bodů (n ). Můžete přidat počet řádků přispívajících ke každému datovému bodu, abyste označili váhu.

Jedna menší překážka:Varianta width_bucket() potřebujeme pracovat na double precision nebo numeric čísla, nikoli na timestamp a kol. Stačí extrahovat epochu pracovat.

Za předpokladu této definice tabulky a aktuální verze Postgres:

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

Dotaz:

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;

Výsledek:

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

Vrátí 400 řádků – pokud není N <n , v takovém případě dostanete N řádky.

Související:




  1. zřetězení spojení zpět do cílové tabulky

  2. Aktualizovat, pokud existuje, vložit, pokud neexistuje

  3. Jaké je řešení pro použití dynamického SQL v uložené proceduře

  4. Jak se dotazovat na přírůstkové aktualizace postgres od zadaného bodu (časové razítko nebo ID transakce)?