SQLのウィンドウ関数は、クエリの結果セット内の行に対して計算を行うための関数で、データの分析や集計が効率的に行えます。
ウィンドウ関数は、以下の形式で使用されます。
<ウィンドウ関数> OVER (
[PARTITION BY <列名>]
[ORDER BY <列名>]
[<ウィンドウフレーム指定>]
)
OVER句は、ウィンドウ関数とともに使用され、指定した範囲(ウィンドウ)内で集計や順位付けを行うための句です。例えば、SUM, AVG, ROW_NUMBER, RANKなどの関数と組み合わせて、グループ全体や一部に対する集計や順位を計算できます。
PARTITION BYはデータをグループに分割し、ORDER BYは各グループ内での行の順序を指定します。ウィンドウフレームは集計の範囲を指定します。
順位付けをするウィンドウ関数
順位付けをするウィンドウ関数は、主に次の3つがあります。
- RANK()
- DENSE_RANK()
- ROW_NUMBER()
これらの関数は、特定の順序で行に順位を付けます。
それぞれの違いを説明します。
RANK()
RANK()関数は、指定された順序に基づいて行に順位を付けます。
重複する値がある場合、同じ順位が付けられ、次の順位はスキップされます。
SELECT
名前,
得点,
RANK() OVER (ORDER BY 得点 DESC) AS ランク
FROM
成績表;
DENSE_RANK()
DENSE_RANK()関数も重複する値に同じ順位を付けますが、次の順位はスキップされず、連続した数値が付けられます。
SELECT
名前,
得点,
DENSE_RANK() OVER (ORDER BY 得点 DESC) AS ランク
FROM
成績表;
ROW_NUMBER()
ROW_NUMBER()関数は、指定された順序に基づいて各行に一意の順位を付けます。
重複する値があっても、一意の数値が付けられます。
SELECT
名前,
得点,
ROW_NUMBER() OVER (ORDER BY 得点 DESC) AS ランク
FROM
成績表;
使用例
次に、各関数の使用例を示します。
成績表のデータが以下のようにあると仮定します。
| 名前 | 得点 |
|---|---|
| 田中 | 95 |
| 鈴木 | 85 |
| 佐藤 | 95 |
| 高橋 | 75 |
| 伊藤 | 85 |
RANK()の例
SELECT
名前,
得点,
RANK() OVER (ORDER BY 得点 DESC) AS ランク
FROM
成績表;
実行結果は以下のとおりです。
| 名前 | 得点 | ランク |
|---|---|---|
| 田中 | 95 | 1 |
| 佐藤 | 95 | 1 |
| 鈴木 | 85 | 3 |
| 伊藤 | 85 | 3 |
| 高橋 | 75 | 5 |
DENSE_RANK()の例
SELECT
名前,
得点,
DENSE_RANK() OVER (ORDER BY 得点 DESC) AS ランク
FROM
成績表;
実行結果は以下のとおりです。
| 名前 | 得点 | ランク |
|---|---|---|
| 田中 | 95 | 1 |
| 佐藤 | 95 | 1 |
| 鈴木 | 85 | 2 |
| 伊藤 | 85 | 2 |
| 高橋 | 75 | 3 |
ROW_NUMBER()の例
SELECT
名前,
得点,
ROW_NUMBER() OVER (ORDER BY 得点 DESC) AS ランク
FROM
成績表;
実行結果は以下のとおりです。
| 名前 | 得点 | ランク |
|---|---|---|
| 田中 | 95 | 1 |
| 佐藤 | 95 | 2 |
| 鈴木 | 85 | 3 |
| 伊藤 | 85 | 4 |
| 高橋 | 75 | 5 |
おわりに
このように、ウィンドウ関数を使用することで、データの順位付けが簡単に行えます。各関数の違いを理解し、適切な場面で使用することで、より効果的なデータ分析が可能になります。

