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

Tæl rækker i partition med Bestil efter

Når du tilføjer en order by til et aggregat, der bruges som en vinduesfunktion, bliver aggregatet til en "løbende tælling" (eller hvad som helst aggregat du bruger).

count(*) vil returnere antallet af rækker op til den "aktuelle" baseret på den specificerede rækkefølge.

Følgende forespørgsel viser de forskellige resultater for aggregater, der bruges med en order by . Med sum() i stedet for count() det er lidt nemmere at se (efter min mening).

with test (id, num, x) as (
  values 
    (1, 4, 1),
    (2, 4, 1),
    (3, 5, 2),
    (4, 6, 2)
)
select id, 
       num,
       x,
       count(*) over () as total_rows, 
       count(*) over (order by id) as rows_upto,
       count(*) over (partition by x order by id) as rows_per_x,
       sum(num) over (partition by x) as total_for_x,
       sum(num) over (order by id) as sum_upto,
       sum(num) over (partition by x order by id) as sum_for_x_upto
from test;
 

vil resultere i:

id | num | x | total_rows | rows_upto | rows_per_x | total_for_x | sum_upto | sum_for_x_upto ---+-----+---+------------+-----------+------------+-------------+----------+--------------- 1 | 4 | 1 | 4 | 1 | 1 | 8 | 4 | 4 2 | 4 | 1 | 4 | 2 | 2 | 8 | 8 | 8 3 | 5 | 2 | 4 | 3 | 1 | 11 | 13 | 5 4 | 6 | 2 | 4 | 4 | 2 | 11 | 19 | 11

Der er flere eksempler i Postgres-manualen



  1. Tilslutning til en Oracle-database ved hjælp af SQLAlchemy

  2. en til en distinkt begrænsning af udvælgelsen

  3. table_exists()-metoden fungerer muligvis ikke korrekt

  4. Få timer og minutter (TT:MM) fra dato