2025 年、生成 AI は複雑なクエリも書けるようになりましたが、「どんなクエリが最適か」を判断できるのは依然として人間です。
とくに 集計+詳細 を同時に取得できるウィンドウ関数(分析関数)は、BI/DX の現場で避けて通れません。
本記事では PostgreSQL / MySQL 8 / BigQuery / Redshift で共通して使える構文と実務レシピを網羅します。
カテゴリ | 代表関数 | 用途 |
---|---|---|
順位づけ | ROW_NUMBER() RANK() DENSE_RANK() | ランキング表・トップ N 抽出 |
移動集計 | LAG() / LEAD() FIRST_VALUE() LAST_VALUE() | 前後比較・差分計算 |
累積集計 | SUM() OVER AVG() OVER | 売上累計・移動平均 |
分位点 | PERCENT_RANK() NTILE(n) | パーセンタイル・箱ひげ図 |
PARTITION BY
で“どのグループごと”に窓を分けるか決定ORDER BY
で“並び順”を指定しないと LAG()
や ROW_NUMBER()
は意味を成さないROWS
/ RANGE
句でフレーム(何行を対象にするか)を制御SELECT
order_date,
SUM(amount) OVER(ORDER BY order_date) AS running_total
FROM sales;
SELECT
user_id,
total_points,
RANK() OVER(PARTITION BY region ORDER BY total_points DESC) AS rank_in_region
FROM leaderboard;
SELECT
week,
revenue,
revenue - LAG(revenue) OVER(ORDER BY week) AS diff_prev_week,
ROUND(100.0 * (revenue / LAG(revenue) OVER(ORDER BY week) - 1), 1) AS pct_growth
FROM weekly_revenue;
SELECT *
FROM (
SELECT
store_id, region, monthly_sales,
ROW_NUMBER() OVER(PARTITION BY region ORDER BY monthly_sales DESC) AS r
FROM store_sales
) t
WHERE r <= 3;
SELECT
d,
temp,
AVG(temp) OVER(
ORDER BY d
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS ma7
FROM weather;
SELECT
product_id,
price,
MIN(price) OVER(PARTITION BY product_id) AS min_p,
MAX(price) OVER(PARTITION BY product_id) AS max_p
FROM price_history;
SELECT
user_id,
spend,
NTILE(4) OVER(ORDER BY spend DESC) AS quartile
FROM user_spend;
SELECT
order_id,
amount,
AVG(amount) OVER(
ORDER BY order_date
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS avg_last3
FROM orders;
SELECT
week,
team,
score,
DENSE_RANK() OVER(PARTITION BY week ORDER BY score DESC) AS dense_rank
FROM team_score;
SELECT
tx_id,
tx_time,
amount,
SUM(amount) OVER(
ORDER BY tx_time
RANGE BETWEEN INTERVAL '30 days' PRECEDING AND CURRENT ROW
) AS balance_30d
FROM transactions;
生成 AI に日本語プロンプトでウィンドウ関数を作らせる例:
「ユーザーごとに入会日からの経過月と、月ごとの累計課金額を求める SQL を書いて」
Copilot / Cursor / Gemini Code Assist は、上記プロンプトに対し DATE_TRUNC()
と SUM() OVER … ORDER BY
を組み合わせたクエリを提示。
RAG 構成なら、メタデータとして information_schema を渡すことでカラム名の誤認も抑えられます。
ROW_NUMBER()
なのに ORDER BY
を忘れると結果は不定。必ず確認。
ROWS BETWEEN UNBOUNDED PRECEDING
と書かずデフォルトの「現在行のみ」になり累積しない事故が多発。
NULLS LAST
、BigQuery は常に NULLS LAST。環境差異に注意。
ウィンドウ関数は、
SQL を生成 AI に任せる前提でも、“何を PARTITION し、どう ORDER するか”を理解していれば、クエリ品質とパフォーマンスを自分でコントロールできます。
ぜひウィンドウ関数を“道具箱”に入れ、AI と組み合わせた最速データ分析を体験してください。