こんにちは、阿久梨絵です!
SQL を活用してデータを集計・分析する際、多くの場面でランキング付けや累積計算が必要になります。
通常、SUM() や AVG() のような集計関数を使用すると、データがグループ化され、結果が1行にまとめられるため、個別の行ごとに動的な集計を行うことは難しくなります。
しかし、ウィンドウ関数を使えば、グループ化せずに各行のデータを維持しながらランキングや集計が可能になります。
例えば、次のようなケースではウィンドウ関数が大きな力を発揮します。
・売上ランキングの算出 → 商品ごとの売上順位を決定
・累積売上の計算 → 直近数カ月間の売上を集計
・前年比較 → 昨年と今年の売上データを比較
・顧客ごとの購入頻度分析 → 取引履歴の時間軸を考慮して処理
・社員の採用順序を整理 → 部門ごとの入社順を記録
ウィンドウ関数は、データのパターンや流れを把握するのに役立ち、レポート作成やKPI分析の効率を大幅に向上させます。
SQLの主要なウィンドウ関数
主に使われるウィンドウ関数は以下の5つです。
・RANK() → ランキング(順位付け)を行う
・DENSE_RANK() → 重複なしのランキング
・ROW_NUMBER() → 各行に連番を付与
・SUM() / AVG() → 移動平均や累積計算を実施
・LEAD() / LAG() → 前後のデータを参照し、比較を可能にする
次のセクションでは、これらの関数を実際のクエリで解説していきます!
1. RANK() を使った順位付け
各商品の売上ランキングを表示する。
SELECT product_name, sales_amount,
RANK() OVER(ORDER BY sales_amount DESC) AS rank
FROM sales;
・売上額が高い順にランキングを計算!
・同じ売上額なら同順位として扱う(例:1位が2名なら次は3位)
2. ROW_NUMBER() で連番を付与
各部門の社員にユニークな番号を振る。
SELECT employee_name, department,
ROW_NUMBER() OVER(PARTITION BY department ORDER BY hire_date) AS row_num
FROM employees;
・PARTITION BY department で部門ごとにユニークな番号を振る。
・社員データの整理や並び順の確認に便利!
3. DENSE_RANK() でランキングを厳密化
RANK() との違いは、順位が飛ばないこと!
SELECT employee_name, salary,
DENSE_RANK() OVER(ORDER BY salary DESC) AS rank
FROM employees;
・RANK() では「1位が2人いる場合、次の順位は3位」になるが、DENSE_RANK() なら「1位が2人なら次は2位」になる!
4. 移動平均を計算(SUM() / AVG())
ウィンドウ関数を使って、累積売上や移動平均を計算できます。
SELECT product_name, sales_month, sales_amount,
SUM(sales_amount) OVER(ORDER BY sales_month ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_sum
FROM sales;
・直近3カ月の売上合計を計算(現在+過去2カ月分)
・売上トレンドや業績分析に活用できる!
5. LEAD() / LAG() で前後のデータを取得
売上データの前年・翌年の数値を比較する
・LEAD() → 次のデータを取得(未来データを使う)
・LAG() → 前のデータを取得(過去データを参照)
SELECT product_name, sales_year, sales_amount,
LAG(sales_amount, 1) OVER(PARTITION BY product_name ORDER BY sales_year) AS prev_year_sales,
LEAD(sales_amount, 1) OVER(PARTITION BY product_name ORDER BY sales_year) AS next_year_sales
FROM sales;
・前年・翌年の売上データを取得し、比較を簡単に!
・前年比較や売上推移の分析に最適!
まとめ
・RANK() → 売上や成績ランキングを取得
・ROW_NUMBER() → 部門ごとにユニークな番号付与
・DENSE_RANK() → 順位を厳密に管理
・SUM() / AVG() → 移動平均や累積集計に活用
・LEAD() / LAG() → 前後データを取得してトレンド分析
ウィンドウ関数を使えば、 SQL で複雑なランキングや集計処理がスムーズに!
ビジネスデータの分析や売上管理を効率化するために、ぜひ活用してみてください
阿久梨絵でした!