行を残したまま、グループ内の順位・累計・前の行との差を計算する。
ウィンドウ関数は、GROUP BY のように行をまとめずに、「同じグループの行たち(ウィンドウ)」を見て計算した値を各行に付け足す関数です。関数() OVER (PARTITION BY グループ ORDER BY 並び) の形で書きます。CTE(WITH 名前 AS (…))は、途中の結果に名前をつけて段階的に書く方法で、長い分析 SQL が読みやすくなります。
| 関数 | すること | よく使う場面 |
|---|---|---|
ROW_NUMBER() | グループ内で 1, 2, 3… と番号をふる(同点でも別の番号) | 最新の1件・重複の除去 |
RANK()・DENSE_RANK() | 同点は同じ順位(RANK は次を飛ばす) | ランキング |
LAG()・LEAD() | 前の行・次の行の値を取る | 前日比・前回の購入からの日数 |
SUM() OVER (ORDER BY …) | 累計 | 月ごとの累計売上 |
AVG() OVER (… ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) | 移動平均 | 7日移動平均 |
WITH daily AS (
SELECT order_date, SUM(amount) AS sales
FROM orders
GROUP BY order_date
)
SELECT
order_date,
sales,
sales - LAG(sales) OVER (ORDER BY order_date) AS diff_prev_day,
SUM(sales) OVER (ORDER BY order_date) AS running_total,
AVG(sales) OVER (ORDER BY order_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS ma7
FROM daily
ORDER BY order_date;面接ではこう答える
ウィンドウ関数は、GROUP BY のように行をまとめずに、同じグループの行を見て計算した値を各行に足す関数です。OVER の中に PARTITION BY でグループを、ORDER BY で並びを書きます。ROW_NUMBER で最新の1件を取る、LAG で前日比を出す、SUM OVER で累計、ROWS BETWEEN で移動平均を出す、といった分析の定番がすべてこれで書けます。
Dataとの関わり重複の除去・前日比・累計・ランキングなど、変換の SQL で毎日のように使います。SQL のライブコーディングでも最もよく出ます。
DBラボを読み込んでいます…