PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Zählen Sie die Zeilen in der Partition mit Order By

Wenn Sie ein order by hinzufügen zu einem Aggregat, das als Fensterfunktion verwendet wird, wird dieses Aggregat zu einer "laufenden Zählung" (oder was auch immer Sie verwenden).

Der count(*) gibt die Anzahl der Zeilen bis zur "aktuellen" basierend auf der angegebenen Reihenfolge zurück.

Die folgende Abfrage zeigt die unterschiedlichen Ergebnisse für Aggregate, die mit einem order by verwendet werden . Mit sum() statt count() es ist etwas einfacher zu sehen (meiner Meinung nach).

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;

ergibt:

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

Weitere Beispiele finden Sie im Postgres-Handbuch