SQL Server | ROW_NUMBERの使い方

【注目記事】

・SEの転職体験談 | 受託開発から自社製品開発へ
・SIer勤務のSEがパソナキャリアに相談してみた
・SIer勤務のSEがマイナビエージェントに相談してみた

SQL Serverで検索結果に対して連番をふれるROW_NUMBERの使い方を解説します。

ROW_NUMBERの構文

ROW_NUMBERの構文は下記の通りです。

  • PATITION BY : GROUP BYと同様にグルーピング対象の列を指定できます。この引数は省略可能で、グループごとに連番を設定したい時に使用します。
  • ORDER BY : 並び替えする基準となる列を指定します。

使用例

ROW_NUMBERの使用例を紹介します。

使用データ

学生情報を管理するテーブルを使用します。

学生番号名前性別
StudentIDNameSex
1山田 太郎1
2鈴木 花子1
3山田 太郎2
4鈴木 花子2
5山田 太郎3
6鈴木 花子3

例 : テーブル全体に連番をふる

SQL

テーブル全体に連番を振る場合は、PATITION BYに何も指定せず、ORDER BYのみ指定します。

例では、ORDER BYに学生番号(StudentID)を指定しています。

処理結果

学生番号(StudentID)とROW_NUMBERで取得した順番が同じ値になります。

StudentIDNameSex順番
1山田 太郎1                        1
2鈴木 花子1                        2
3山田 太郎2                        3
4鈴木 花子2                        4
5山田 太郎3                        5
6鈴木 花子3                        6

例 : グループごとに連番をふる

SQL

グループごとに連番を振る場合は、PATITION BYにグループ化する列を指定します。

例では性別(Sex)でグループ化しています。

処理結果

性別(Sex)ごとに、学生番号(StudentID)の順に連番がふられます。

StudentIDNameSex順番
2鈴木 花子1                        1
4鈴木 花子2                        2
6鈴木 花子3                        3
1山田 太郎1                        1
3山田 太郎2                        2
5山田 太郎3                        3

連番をWHERE句で使用する場合

ROW_NUMBERで取得した連番を、WHERE句で使用することはできません。

WHERE句で使用するためには、 ROW_NUMBER を副問い合わせの中で使い、副問い合わせの結果に対して検索条件を指定します。

RANK、DENSE_RANKとの違い

ROW_NUMBERと同様に連番を取得する関数に「RANK」と「 DENSE_RANK 」があります。

違いは同じ順位のデータがあった場合の挙動です。

種類概要
ROW_NUMBER同じ順位であっても別の連番になります。連番は実行のたびに変わることがあります。
RANK同じ順位は同じ連番となり、その次の順位は飛ばします。
DENSE_RANK同じ順位は同じ連番となり、その次の順位は飛ばしません。

SQL

処理結果

StudentIDNameSexROW_NUMBERRANKDENSE_RANK
1山田 太郎1                        111
1鈴木 花子1                        211
1山田 太郎2                        311
4鈴木 花子2                        442
5山田 太郎3                        553
6鈴木 花子3                        664

参考書籍

SQLスキルを高めるためのおススメ書籍

SQLのスキルを高めるには、学校の試験勉強と同じように多くの問題を解いてみるのが効率的です。

『スッキリわかるSQL入門 第2版 ドリル222問付き! (スッキリシリーズ)』は、SQLの基本的な内容の解説に加え、200問を超える問題が掲載されているので、SQL初心者が学習に使うのにおススメです。

実際、この書籍を新卒1年目の新人さんに2-3週間かけて取組んでもらったことがあり、書籍を読んだ後に簡単なSQLの改修を任せましたが、基本的な部分にはつまずかずに改修を進められました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です