本文へスキップ
BecomeCoder

SQL データ操作 (DML)コース · 第7章 高度なクエリ · レッスン32

ウィンドウ関数② ― 累計と移動平均

ブラウザで完結

導入

順位だけでなく、「ここまでの累計」「直近数件の移動平均」といった、時系列の分析もウィンドウ関数の得意技です。SUMAVGOVER (...) を付けるだけで、行を残したまま「積み上げ」や「ならし」が計算できます。売上レポートの定番テクニックです。

説明

集計関数に 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) や、金額を使った累計に変えて、積み上げの感覚をつかんでください。

演習

productsid 順に並べ、**価格の累計(running total)**を出してください。取り出す列は nameprice と、累計の別名 累計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;

実際に動かしてみよう

下のエディタにクエリを書いて「実行」を押すと、ブラウザ内のSQLiteで結果が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう。

SQL — ブラウザ内で実行(SQLite)

ブラウザ内でSQLを動かす環境(SQLite)を読み込みます(初回のみ一瞬)。
スクロールして表示された時点でも自動で読み込まれます。