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 |
おわりに
このように、ウィンドウ関数を使用することで、データの順位付けが簡単に行えます。各関数の違いを理解し、適切な場面で使用することで、より効果的なデータ分析が可能になります。