sql >> Database >  >> RDS >> PostgreSQL

Tel rijen in partitie met Order By

Wanneer u een order by naar een aggregaat dat als vensterfunctie wordt gebruikt, dat aggregaat verandert in een "lopende telling" (of welk aggregaat u ook gebruikt).

De count(*) retourneert het aantal rijen tot de "huidige" op basis van de opgegeven volgorde.

De volgende query toont de verschillende resultaten voor aggregaten die worden gebruikt met een order by . Met sum() in plaats van count() het is een beetje makkelijker te zien (naar mijn 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;

zal resulteren in:

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

Er zijn meer voorbeelden in de Postgres-handleiding



  1. Oracle SELECT - Dubbele aanhalingstekens of geen dubbele aanhalingstekens?

  2. Waarom krijg ik deze foutmelding 'Communicatie link mislukt Het laatste pakket verzonden...' wanneer ik verbinding maak met MySQL met Java (Netbeans)?

  3. Django tekst zoeken met gedeeltelijke zin match update naar django3

  4. Update meerdere rijen met verschillende waarden in een enkele query - MySQL