こんにちは。たいら(@tairaengineer2)です。
この記事では、SQL Serverで連番をふることができるROW_NUMBER関数について解説します。
スポンサーリンク
- 前提条件
- ROW_NUMBER関数とは
- 解説で使うテーブル
- パターン1:SELECTした結果に連番をふるパターン
- パターン2:SELECTした結果をグループ化して連番をふるパターン
- まとめ:連番をふるときはROW_NUMBER関数を使おう!
前提条件
この記事では、Microsoft SQL Server2017を使っています。
インストールの仕方は、下の記事をご参考ください。
ROW_NUMBER関数とは
ROW_NUMBER関数とは、SELECTした結果に連番をふることができる関数です。
ROW_NUMBER (Transact-SQL)
適用対象: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse
結果セットの出力に番号を設定します。 具体的には、結果セットのパーティション内の行について、各パーティションの最初の行を 1 とした連続する数値を返します。
ROW_NUMBER (Transact-SQL) - SQL Server | Microsoft Docsから引用させて頂きました
ROW_NUMBER関数の書き方は
- SELECTした結果に連番をふるパターン
- SELECTした結果をグループ化して連番をふるパターン
の2パターンがあります。
SELECTした結果に連番をふるパターンの書き方は以下です。
ROW_NUMBER() OVER(ORDER BY 【ソートする列1,ソートする列2…】 【ASCまたはDESC】)
SELECTした結果をグループ化して連番をふるパターンの書き方は以下です。
ROW_NUMBER() OVER(PARTITION BY 【グループ化する列】 ORDER BY age 【ソートする列1,ソートする列2…】 【ASCまたはDESC】)
では、次の章でどちらのパターンも実際に使ってみます。
解説で使うテーブル
ROW_NUMBER関数の解説で使うテーブルは、【Person】テーブルです。
id | name | age | job | gender |
---|---|---|---|---|
a001 | 田中 | 26 | 植木屋 | 1 |
a002 | 佐藤 | 35 | 運送 | 2 |
a003 | 山田 | 20 | 大工 | 1 |
a004 | 金子 | 35 | 翻訳 | 0 |
a005 | 田中 | 40 | エンジニア | 1 |
a006 | 田中 | 10 | 小学生 | 0 |
A101 | 鈴木 | 24 | プロ野球 | 2 |
A102 | 田畑 | 14 | 中学生 | 0 |
A103 | 中 | 21 | 大学生 | 0 |
このテーブルに対して、
- SELECTした結果に連番をふるパターン
- SELECTした結果をグループ化して連番をふるパターン
の2パターンで実行していきます。
パターン1:SELECTした結果に連番をふるパターン
【Person】テーブルの【age】の列に対して、昇順で連番を付けます。
SELECT文は、以下になります。
SELECT [id]
,[name]
,[age]
,[job]
,[gender]
,ROW_NUMBER() OVER(ORDER BY age ASC) AS row_order
FROM [Sample].[dbo].[Person]
実行結果は以下になります。
id | name | age | job | gender | row_order |
---|---|---|---|---|---|
a006 | 田中 | 10 | 小学生 | 0 | 1 |
A102 | 田畑 | 14 | 中学生 | 0 | 2 |
a003 | 山田 | 20 | 大工 | 1 | 3 |
A103 | 中 | 21 | 大学生 | 0 | 4 |
A101 | 鈴木 | 24 | プロ野球 | 2 | 5 |
a001 | 田中 | 26 | 植木屋 | 1 | 6 |
a002 | 佐藤 | 35 | 運送 | 2 | 7 |
a004 | 金子 | 35 | 翻訳 | 0 | 8 |
a005 | 田中 | 40 | エンジニア | 1 | 9 |
【age】の列に対して、昇順で連番がつけられていることが確認できました!
パターン2:SELECTした結果をグループ化して連番をふるパターン
【Person】テーブルの【gender】の列をグループ化し、【age】の列に対して、降順で連番を付けます。
SELECT文は、以下になります。
SELECT [id]
,[name]
,[age]
,[job]
,[gender]
,ROW_NUMBER() OVER(PARTITION BY gender ORDER BY age DESC) AS partition_order
FROM [Sample].[dbo].[Person]
実行結果は以下になります。
id | name | age | job | gender | partition_order |
---|---|---|---|---|---|
a004 | 金子 | 35 | 翻訳 | 0 | 1 |
A103 | 中 | 21 | 大学生 | 0 | 2 |
A102 | 田畑 | 14 | 中学生 | 0 | 3 |
a006 | 田中 | 10 | 小学生 | 0 | 4 |
a005 | 田中 | 40 | エンジニア | 1 | 1 |
a001 | 田中 | 26 | 植木屋 | 1 | 2 |
a003 | 山田 | 20 | 大工 | 1 | 3 |
a002 | 佐藤 | 35 | 運送 | 2 | 1 |
A101 | 鈴木 | 24 | プロ野球 | 2 | 2 |
【gender】の列をグループ化し、【age】の列に対して、降順で連番がつけられていることが確認できました!
スポンサーリンク
まとめ:連番をふるときはROW_NUMBER関数を使おう!
以上がROW_NUMBER関数の解説です。
SELECT結果に連番をふりたいとき、ぜひROW_NUMBER関数を使ってみてください!。
あなたのご参考になったのなら、とても嬉しいです(*´▽`*)
ではでは~(・ω・)ノシ
他にもSQL Serverについて記事を書いています。
良ければこちらもご参考ください。
【SQL Server】大文字から小文字に変換するLOWER関数について解説します
【SQL Server】小文字から大文字に変換するUPPER関数について解説します
今までブログで書いたSQL Serverの解説記事のまとめは、こちらをご参考ください。