Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

SQLのrow_number関数についてまとめています。

SQLのrow_number関数の構文

row_number関数は、機能としては「連番を振る」関数です。

  1. SELECT
  2. ROW_NUMBER() OVER(ORDER BY score ASC) num
  3. , user_name
  4. , score
  5. FROM scores

【関連記事】
SQLで行番号を取得する ROW_NUMBER・ROWNUM・ユーザ定義変数の使い方 

しかし、具体的な使い方は、サブクエリと組み合わせることで、グルーピングしたデータの上位n番、下位n番といった条件指定が可能になるんですね。

以下の例は、Cityごとにグルーピングし、scoreを昇順にソートして連番を振っています。

  1. SELECT
  2. ROW_NUMBER() OVER(PARTITION BY City ORDER BY Age ASC) num
  3. name
  4. , city
  5. , score
  6. FROM scores
  7.  
  8. num user_name city score
  9. 1 山田 太郎 Tokyo 10
  10. 2 鈴木 一郎 Tokyo 20
  11. 1 佐藤 太郎 Nagoya 30
  12. 2 田中 次郎 Nagoya 40
  13. 1 伊藤 太郎 Osaka 50

【関連記事】
【SQL】連番を振るROW_NUMBER関数を解説!一番よく使う順位付け関数をマスターしよう 

Oracleのrow_number関数の構文

以下は、Oracleのrow_number関数の使用例です。hr.employees表で各部門の支給額の高いトップ3人の従業員のレコードを抽出します。従業員が3人未満の部門は、3行未満の行が戻されます。

  1. SELECT department_id, first_name, last_name, salary
  2. FROM
  3. (
  4. SELECT
  5. department_id, first_name, last_name, salary,
  6. ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary desc) rn
  7. FROM employees
  8. )
  9. WHERE rn <= 3
  10. ORDER BY department_id, salary DESC, last_name;

関連)Oracle公式ドキュメント:ROW_NUMBER

SQL Serverのrow_number関数の構文

SQL Serverのrow_numberの構文は以下の通りです。

  1. ROW_NUMBER ( )
  2. OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )

関連)ROW_NUMBER (Transact-SQL) – SQL Server | Microsoft Docs

以下のSQLは、sys.databasesテーブルのdatabase_idが5以下のデータベースに、nameを昇順にソートして連番を振っている例です。

  1. SELECT
  2. ROW_NUMBER() OVER(ORDER BY name ASC) AS Row#,
  3. name, recovery_model_desc
  4. FROM sys.databases
  5. WHERE database_id < 5;
  6.  
  7. Row# name recovery_model_desc
  8. 1 master SIMPLE
  9. 2 model FULL
  10. 3 msdb SIMPLE
  11. 4 tempdb SIMPLE

以下は、PARTITION BY指定をおこなって、SalesTerritoryKeyごとにグルーピングした上でグループごとに連番を振っています。

  1. -- Uses AdventureWorks
  2. SELECT ROW_NUMBER() OVER(PARTITION BY SalesTerritoryKey
  3. ORDER BY SUM(SalesAmountQuota) DESC) AS RowNumber,
  4. LastName, SalesTerritoryKey AS Territory,
  5. CONVERT(varchar(13), SUM(SalesAmountQuota),1) AS SalesQuota
  6. FROM dbo.DimEmployee AS e
  7. INNER JOIN dbo.FactSalesQuota AS sq
  8. ON e.EmployeeKey = sq.EmployeeKey
  9. WHERE e.SalesPersonFlag = 1
  10. GROUP BY LastName, FirstName, SalesTerritoryKey;
  11.  
  12. RowNumber LastName Territory SalesQuota
  13. --------- ------------------ --------- -------------
  14. 1 Campbell 1 4,025,000.00
  15. 2 Ansman-Wolfe 1 3,551,000.00
  16. 3 Mensa-Annan 1 2,275,000.00
  17. 1 Blythe 2 11,162,000.00
  18. 1 Carson 3 12,198,000.00
  19. 1 Mitchell 4 11,786,000.00
  20. 2 Ito 4 7,804,000.00
  21.  
  22.  

MySQLでrow_number関数を使わず行番号をつける

MySQLには、row_number関数がありません。ユーザ変数を使って、行番号を振ることが可能です。

  1. SET @rownum=0;
  2.  
  3. SELECT
  4. @rownum:=@rownum+1 as num,
  5. first_name,
  6. last_name,
  7. hire_date
  8. FROM employees
  9. ORDER BY hire_date;
  10.  
  11. +------+-------------+--------------+------------+
  12. | num | first_name | last_name | hire_date |
  13. +------+-------------+--------------+------------+
  14. | 1 | Tonny | Butterworth | 1985-01-01 |
  15. | 2 | Ebru | Alpin | 1985-01-01 |
  16. | 3 | Przemyslawa | Kaelbling | 1985-01-01 |
  17. | 4 | DeForest | Hagimont | 1985-01-01 |
  18. | 5 | Peternela | Onuegbe | 1985-01-01 |
  19. | 6 | Krassimir | Wegerle | 1985-01-01 |
  20. | 7 | Arie | Staelin | 1985-01-01 |
  21. | 8 | Margareta | Markovitch | 1985-01-01 |
  22. | 9 | Shirish | Ossenbruggen | 1985-01-01 |
  23. | 10 | Isamu | Legleitner | 1985-01-14 |
  24. :
  25. :

【関連記事】
SQLで行番号を取得する ROW_NUMBER・ROWNUM・ユーザ定義変数の使い方 | 

PostgreSQLのrow_number関数の構文

以下は、PostgreSQLでrow_number関数を使用する例です。

  1. SELECT
  2. product_id,
  3. product_name,
  4. group_id,
  5. ROW_NUMBER () OVER (
  6. ORDER BY product_name
  7. )
  8. FROM
  9. products;
  10.  

関連)PostgreSQL ROW_NUMBER() Explained with Practical Examples

まとめ

ポテパンダの一言メモ
  • row_number関数は、連番を生成する関数
  • partition byやorder byでグルーピング範囲とソート指定が可能
  • MySQLにはrow_number関数がないが、ユーザ定義変数で代用可能

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。