sql >> Database >  >> RDS >> PostgreSQL

Hoe de resultaatrijen van SQL-query's gelijkelijk in het volledige bereik te verminderen?

In Postgres , width_bucket() is precies wat u zoekt - om een ​​willekeurig aantal rijen te granuleren (N ) in de onderliggende tabel in een gegeven (bij voorkeur kleiner ) aantal datapunten (n ). U kunt het aantal rijen dat bijdraagt ​​aan elk gegevenspunt toevoegen om het gewicht aan te geven.

Een klein obstakel:de variant van width_bucket() we moeten werken op double precision of numeric cijfers, niet op timestamp et al. Pak gewoon het tijdperk . uit om mee te werken.

Uitgaande van deze tabeldefinitie en een huidige Postgres-versie:

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

Vraag:

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;

Resultaat:

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

Retourneert 400 rijen - tenzij N <n , in welk geval je N . krijgt rijen.

Gerelateerd:




  1. PostgreSQL array_agg volgorde

  2. MySQL werkt Varchar-kolom bij met NULL

  3. Hoe de Exp()-functie werkt in PostgreSQL

  4. Log in met LDAP met JSF 2,1 &Apache Tomcat