導入
順位だけでなく、「ここまでの累計」「直近数件の移動平均」といった、時系列の分析もウィンドウ関数の得意技です。SUM や AVG に OVER (...) を付けるだけで、行を残したまま「積み上げ」や「ならし」が計算できます。売上レポートの定番テクニックです。
説明
集計関数に OVER (ORDER BY ...) を付けると、「先頭からその行まで」を対象に計算する**累計(running total)**になります。
SELECT id, ordered_at,
COUNT(*) OVER (ORDER BY ordered_at) AS 累計注文数
FROM orders;
SUM(...) OVER (ORDER BY ...) なら金額の累計、AVG(...) OVER (...) なら平均の推移です。「範囲」を明示すると移動平均(直近N件のならし)も書けます。ROWS BETWEEN 2 PRECEDING AND CURRENT ROW は「今の行とその手前2行、計3行」を対象にする指定です。
SELECT id, ordered_at,
AVG(id) OVER (ORDER BY ordered_at ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS 移動平均
FROM orders;
flowchart LR
A["集計関数<br/>SUM / AVG / COUNT"] --> B["OVER (ORDER BY …)<br/>= 累計"]
A --> C["OVER (… ROWS BETWEEN …)<br/>= 移動平均(窓をずらす)"]
GROUP BY の集計は行が1つにまとまってしまいますが、ウィンドウ関数は元の行を1行ずつ残したまま、その隣に計算結果を添えます。「明細を見せつつ、累計も出す」レポートにうってつけです。
やってみよう
初期表示のクエリを実行し、注文が日付順に並びながら「累計注文数」が 1, 2, 3… と積み上がることを確認しましょう。次に COUNT(*) を SUM(1) や、金額を使った累計に変えて、積み上げの感覚をつかんでください。
演習
products を id 順に並べ、**価格の累計(running total)**を出してください。取り出す列は name・price と、累計の別名 累計。SUM(price) OVER (ORDER BY id) を使います。
ヒント1を見る
SUM(price) OVER (ORDER BY id) AS 累計
ヒント2を見る
SELECT name, price, SUM(price) OVER (ORDER BY id) AS 累計 FROM products;