PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Compter les lignes dans la partition avec Trier par

Lorsque vous ajoutez un order by à un agrégat utilisé comme fonction de fenêtre qui se transforme en un "compte courant" (ou tout autre agrégat que vous utilisez).

Le count(*) renverra le nombre de lignes jusqu'à "l'actuelle" en fonction de l'ordre spécifié.

La requête suivante montre les différents résultats pour les agrégats utilisés avec un order by . Avec sum() au lieu de count() c'est un peu plus facile à voir (à mon avis).

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;

entraînera :

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

Il y a plus d'exemples dans le Manuel Postgres