sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur minskar man resultatrader med SQL-fråga lika mycket i hela intervallet?

I Postgres , width_bucket() är precis det du letar efter - att granulera valfritt antal rader (N ) i den underliggande tabellen till en given (helst mindre ) antal datapunkter (n ). Du kan lägga till antalet rader som bidrar till varje datapunkt för att ange vikt.

Ett mindre hinder:varianten av width_bucket() vi behöver fungerar med double precision eller numeric nummer, inte på timestamp et al. Extrahera bara epoken att arbeta med.

Förutsatt att denna tabelldefinition och en aktuell Postgres-version:

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

Fråga:

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;

Resultat:

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

Returnerar 400 rader - om inte N <n , i så fall får du N rader.

Relaterat:




  1. MySQL MOD() är trasig:Är detta det bästa alternativet?

  2. Flera men ömsesidigt uteslutande främmande nycklar - är det här vägen att gå?

  3. 4 funktioner för att returnera månaden från ett datum i MariaDB

  4. Begränsning av inre fråga med yttre frågeattribut