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

Hvordan reducerer man resultatrækker af SQL-forespørgsler lige meget i hele spektret?

I Postgres , width_bucket() er lige det, du leder efter - at granulere et vilkårligt antal rækker (N ) i den underliggende tabel til en given (helst mindre ) antal datapunkter (n ). Du kan tilføje antallet af rækker, der bidrager til hvert datapunkt, for at angive vægt.

En mindre hindring:Varianten af ​​width_bucket() vi har brug for fungerer på double precision eller numeric tal, ikke på timestamp et al. Udtræk bare epoken at arbejde med.

Forudsat denne tabeldefinition og en aktuel Postgres-version:

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

Forespørgsel:

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
...

Returnerer 400 rækker - medmindre N <n , i så fald får du N rækker.

Relateret:




  1. MySQL næste/forrige id'er (vilkårlig sorteringsrækkefølge)

  2. Postgresql JDBC-tabel værdisatte parametre

  3. SWITCH med LIKE inde i SELECT-forespørgsel i MySQL

  4. SQL JOIN to tabeller med AVG