ROW_NUMBERについてはじめに
ROW_NUMBER()
は、ウィンドウ関数(Window Function)の一種です。
行の順序に基づいて連続する整数を割り当てるために使用されます。通常、ソートされた結果セットに対して連番を振るのに便利です。これは特にページングやランキングなどの目的に使用されます。
ROW_NUMBERの構文
ROW_NUMBER()
関数の構文は以下になります。
ROW_NUMBER() OVER (PARTITION BY partition_expression ORDER BY sort_expression [ASC | DESC])
ROW_NUMBER()
- ウィンドウ関数の一つで、行に対して連続する整数を割り当てる関数を指します。
OVER
- ウィンドウ関数を使用する際のキーワードです。
PARTITION BY partition_expression
- 任意の列(または列のリスト)を指定し、その列の値ごとに別々のパーティションを作成します。パーティションごとに行番号がリセットされます。省略可能で、省略した場合は全体の結果セットを1つのパーティションとして扱います。
ORDER BY sort_expression [ASC | DESC]
- 行番号を割り当てるために使用される列(または列のリスト)を指定します。ソート順を指定することもできます(昇順:ASC、降順:DESC)。
ROW_NUMBERの具体例
ORDER BYのみを使用したROW_NUMBERの例
以下は、employeesテーブル
をemployee_name
で昇順にソートし、employee_name
に対して行番号を割り当てる例です。
SELECT
ROW_NUMBER() OVER (ORDER BY employee_name ASC) AS row_num,
employee_id,
employee_name,
department
FROM
employees
row_num
という別名の列が追加され、その列には連番が割り当てられます。
PARTITION BYを使用したROW_NUMBERの例
次に、PARTITION BY
を使用した例を記載します。
例として、以下のような従業員テーブルがあるとします。
employees table
+-------------+---------------+--------------+-------------+
| employee_id | employee_name | department | salary |
+-------------+---------------+--------------+-------------+
| 1 | John Smith | Sales | 50000 |
| 2 | Jane Doe | Marketing | 60000 |
| 3 | Bob Johnson | Sales | 45000 |
| 4 | Mary Brown | HR | 55000 |
| 5 | David Lee | Marketing | 52000 |
+-------------+---------------+--------------+-------------+
このテーブルを部門ごとに給与の高い順に並べ、各部門内で従業員に連番を振る場合を考えてみましょう。つまり、各部門内で給与の高い従業員に1から始まる連番を割り当てたいとします。
以下のクエリでは、PARTITION BY
を使って部門ごとにパーティションを作成し、salary
を降順にソートしています。
SELECT
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS row_num,
employee_id,
employee_name,
department,
salary
FROM
employees
クエリの結果は次のようになります。
+---------+-------------+---------------+--------------+-------------+
| row_num | employee_id | employee_name | department | salary |
+---------+-------------+---------------+--------------+-------------+
| 1 | 4 | Mary Brown | HR | 55000 |
| 1 | 2 | Jane Doe | Marketing | 60000 |
| 2 | 5 | David Lee | Marketing | 52000 |
| 1 | 1 | John Smith | Sales | 50000 |
| 2 | 3 | Bob Johnson | Sales | 45000 |
+---------+-------------+---------------+--------------+-------------+
結果を見ると、各部門内で給与の高い従業員に1から始まる連番が振られていることがわかります。
たとえば、”HR”部門では給与が最も高い”Mary Brown”に1が割り当てられ、”Marketing”部門では”Jane Doe”に1、”David Lee”に2が割り当てられています。
このように、PARTITION BYを使用することで異なるグループ(この場合は部門)に対して個別の連番を作成することができます!
ROW_NUMBERについてまとめ
以上がROW_NUMBER
関数の使用方法になります。
ソートされた結果セットに対して連番を振るのに便利です。クエリ結果に対して上位〇位を表示したい、等のケースに有用です!
SQL文法関連記事
そのほか、SQL関連記事をこちらにまとめておりますのでご参考ください。
> Coffee Tech Blog SQL関連記事
もしプログラム学習でお困りでしたら、受講生に1人ずつ現役プロのパーソナルメンターがつく TechAcademy [テックアカデミー] のご活用をぜひご検討ください!
参考になれば幸いです☕
コメント