sql >> Databasteknik >  >> RDS >> PostgreSQL

Räkna rader i partitionen med Order By

När du lägger till en order by till ett aggregat som används som en fönsterfunktion som aggregat förvandlas till en "running count" (eller vilken aggregat man nu använder).

count(*) kommer att returnera antalet rader upp till den "nuvarande" baserat på den angivna ordningen.

Följande fråga visar de olika resultaten för aggregat som används med en order by . Med sum() istället för count() det är lite lättare att se (enligt mig).

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;

kommer att resultera 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

Det finns fler exempel i Postgres-manualen



  1. Sqlite-data och automatiskt skapade knappar på ScrollPane

  2. php mysql PDO får fatalt fel när 2 funktioner anropas för att köra sql-satsen i samma fil

  3. Överväganden kring kolumnordning i index och sorteringar

  4. SQL-fråga med bindningsvariabler körning i Jdbc