【SQL Server】ROW_NUMBER で連番・順位をふる

ROW_NUMBER

SQL Serverの「ROW_NUMBER」は、SELECTした結果に連番・順位を振ります。「ROW_NUMBER」の使い方を解説します。

ROW_NUMBERの使い方

ROW_NUMBER() OVER(ORDER BY {並びかえる列} ASC/DESC)

{並びかえる列}を昇順・降順に並び替え、連番(順位)をふる

ROW_NUMBER() OVER(PARTITION BY {グループ化する列} ORDER BY {並びかえる列} ASC/DESC)

{並びかえる列}を昇順・降順に並び替え、グループごとに連番(順位)をふる

サンプルデータ

empテーブル

empno empname address age region
D001 佐藤花子 東京都渋谷区1-1-1 25 tokyo
D002 山田太郎 北海道札幌市1-2-15 42 hokkaido
D003 中村玉子 埼玉県さいたま市1-1-1000 25 tokyo
D004 伊藤学 東京都渋谷区100-1-1 30 tokyo

例1. ROW_NUMBERで連番をふるパターン

--ROW_NUMBERで連番つきでデータを取得する
SELECT empno,empname,
 ROW_NUMBER() OVER(ORDER BY region,empno ASC) num
FROM emp;
empno empname num
D001 佐藤花子 1
D003 中村玉子 2
D004 伊藤学 3
D002 山田太郎 4

ここでは「ROW_NUMBER」を使って「region,empno」の昇順に並び替えて行ナンバーをふりました。

例2. ROW_NUMBERでグループ毎に連番をふるパターン

--ROW_NUMBERで連番つきでデータを取得する
SELECT empno,empname,
 ROW_NUMBER() OVER(PARTITION BY region ORDER BY region,empno ASC) num
FROM emp;
empno empname num
D001 佐藤花子 1
D003 中村玉子 2
D004 伊藤学 3
D002 山田太郎 1

ここではまず「PARTITION BY region 」でグループ化します。「region」毎にグループ化した中で、「ROW_NUMBER」を使って「region,empno」の昇順に並び替えて行ナンバーをふりました。

ROW_NUMBERとRANKの違い

SQL Serverには、連番をふる関数として他にも「RANK」があります。

「RANK」との違いは、同じ順位に同じ番号をふるのが「RANK」ですが、同じ順位でも違う番号をふるのが「ROW_NUMBER」です。

参照:ROW_NUMBER (Transact-SQL) – Microsoft Docs

以上、SQL Serverの「ROW_NUMBER」で連番・順位をふりました。

コメント