エンジニアの将来って?

現在10年目エンジニアがプログラムの解説、ゲームの研究を書く雑記ブログです

【SQL Server】連番をふれるROW_NUMBER関数について解説します

こんにちは。たいら(@tairaengineer2)です。
この記事では、SQL Serverで連番をふることができるROW_NUMBER関数について解説します。

スポンサーリンク

 

前提条件

この記事では、Microsoft SQL Server2017を使っています。
インストールの仕方は、下の記事をご参考ください。

www.tairax.com

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】テーブルです。

f:id:Tairax:20200123190827p:plain

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]

実行結果は以下になります。

f:id:Tairax:20200123192114p:plain

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]

実行結果は以下になります。

f:id:Tairax:20200123193049p:plain

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の解説記事のまとめは、こちらをご参考ください。

【SQL Server】ブログで書いた使い方記事のまとめ