order by
を追加する場合 アグリゲートが「実行カウント」(または使用するアグリゲート)に変わるウィンドウ関数として使用されるアグリゲートに。
count(*)
指定された順序に基づいて、「現在の行」までの行数を返します。
次のクエリは、order by
で使用される集計のさまざまな結果を示しています。 。 sum()
を使用 count()
の代わりに (私の意見では)少し見やすくなっています。
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;
結果は次のようになります:
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
Postgresマニュアル には他にも例があります。