こんにちは、リーマンパパのこっしーです!
前回の記事では、「GROUP BY句」と「HAVING句」を使ったデータ集計の基本を解説しました(未読の方はぜひこちらをご覧ください!)。
今回の記事では、その続きとして、SQLのWindow関数に焦点を当てます。Window関数を使えば、GROUP BY句では実現できない柔軟なデータ分析が可能になります。
Window関数とは?
Window関数は、SQLでデータを「特定の範囲(ウィンドウ)」に対して集計や計算を行う際に使われる機能です。GROUP BY句ではデータをグループ化した後に集計結果を返しますが、Window関数はグループ化せず、行ごとの詳細情報を保持したまま計算を行えるのが特徴です。
主なメリット
- グループ化せずに計算できる: 明細データを残したまま、集計値を計算できる。
- 柔軟な範囲指定: 例えば、前後の数行や全体の平均を計算可能。
- 複数の集計基準を併用可能: GROUP BY句と違い、1つのクエリで異なる基準の集計を取得できる。
基本構文
Window関数を使うには、集計関数に「OVER句」を付けて使用します。
SELECT カラム名, 集計関数() OVER (PARTITION BY カラム名 ORDER BY カラム名) AS 別名
FROM テーブル名;
`
- PARTITION BY: データをどのようにグループ分けするか指定。
- ORDER BY: グループ内での並び順を指定。
- OVER: Window関数の範囲を定義。
実例:Window関数の使い方
以下の「sales」テーブルを例に考えます。
地域 | 商品 | 売上額 | 日付 |
---|---|---|---|
東京 | 商品A | 1000 | 2025-01-01 |
東京 | 商品B | 2000 | 2025-01-02 |
大阪 | 商品A | 1500 | 2025-01-01 |
大阪 | 商品C | 2500 | 2025-01-02 |
福岡 | 商品A | 1200 | 2025-01-01 |
1. 各行ごとの売上合計と割合
まず、全体の売上合計と、各行の売上割合を計算します。
SELECT 地域, 商品, 売上額,
SUM(売上額) OVER () AS 全体売上,
(売上額 * 1.0 / SUM(売上額) OVER ()) AS 売上割合
FROM sales;
結果:
地域 | 商品 | 売上額 | 全体売上 | 売上割合 |
---|---|---|---|---|
東京 | 商品A | 1000 | 8200 | 0.122 |
東京 | 商品B | 2000 | 8200 | 0.244 |
大阪 | 商品A | 1500 | 8200 | 0.183 |
大阪 | 商品C | 2500 | 8200 | 0.305 |
福岡 | 商品A | 1200 | 8200 | 0.146 |
2. 地域ごとの累積売上
地域ごとに売上を日付順に累積してみましょう。
SELECT 地域, 日付, 売上額,
SUM(売上額) OVER (PARTITION BY 地域 ORDER BY 日付) AS 累積売上
FROM sales;
結果:
地域 | 日付 | 売上額 | 累積売上 |
---|---|---|---|
東京 | 2025-01-01 | 1000 | 1000 |
東京 | 2025-01-02 | 2000 | 3000 |
大阪 | 2025-01-01 | 1500 | 1500 |
大阪 | 2025-01-02 | 2500 | 4000 |
福岡 | 2025-01-01 | 1200 | 1200 |
3. 順位付け(RANK関数)
Window関数を使うと、データに順位を付けることも簡単です。
SELECT 地域, 商品, 売上額,
RANK() OVER (ORDER BY 売上額 DESC) AS 売上順位
FROM sales;
結果:
地域 | 商品 | 売上額 | 売上順位 |
---|---|---|---|
大阪 | 商品C | 2500 | 1 |
東京 | 商品B | 2000 | 2 |
大阪 | 商品A | 1500 | 3 |
福岡 | 商品A | 1200 | 4 |
東京 | 商品A | 1000 | 5 |
GROUP BY句との違い
機能 | GROUP BY句 | Window関数 |
---|---|---|
データの詳細行 | 削除される | 保持される |
複数集計 | 不可能 | 可能 |
結果の柔軟性 | 低い | 高い |
GROUP BY句は特定の集計値のみ必要な場合に便利ですが、Window関数は詳細なデータ分析を求める場面で威力を発揮します。
おわりに
Window関数はSQLの中でも非常に強力な機能で、データ分析の可能性を広げてくれます。最初は少し難しいかもしれませんが、実際に手を動かしてみると理解が深まるはずです!
次回は、Window関数を使ったさらに複雑な応用例や、実務で役立つテクニックについて紹介する予定です。お楽しみに!
最後までお読みいただき、ありがとうございました。
それではまた、次の記事でお会いしましょう!ばいばいっ!
コメント