【SQL】Window関数 ~ ROW_NUMBER ~

■ はじめに

SQL文で、ページングを考える

目次

【1】ページング
 1)実務的視点
 2)技術的視点
【2】ROW_NUMBER
 1)構文
 2)補足:ROW_NUMBER + PARTITION BY
【3】サンプル
 補足:使用しているテーブルについて

 【1】ページング

 1)実務的視点

 * ORDER BY句を使用するので、パフォーマンスが心配
 * しかし、データ量が多い時は、I/O的にも有効なので、
 システムを考慮して適用した方がいいかも。

 2)技術的視点

 * Sql Serverには、MySQLやPostgresql にある LIMIT() がない
 * Sql Server 2005 以降の場合、ROW_NUMBER() で実装する

【2】ROW_NUMBER

* 結果セットにシーケンス番号を振ってくれる関数

1)構文

ROW_NUMBER() OVER(ORDER BY [item1],...)

2)補足:ROW_NUMBER + PARTITION BY

* 以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2021/03/11/210937

 【3】サンプル

-- テーブルについては、後述
SELECT [Id]
      ,[Name]
      ,[Address]
      ,[Email]
      ,[Age]
FROM
  (SELECT
     ROW_NUMBER() OVER(ORDER BY [Id]) AS rowNum
      ,[Id]
      ,[Name]
      ,[Address]
      ,[Email]
      ,[Age]
   FROM
     [Person]) AS SubPerson
WHERE
  SubPerson.rowNum BETWEEN 3 AND 5
ORDER BY
  SubPerson.[Id]

 補足:使用しているテーブルについて

CREATE TABLE [Person](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Address] [nvarchar](50) NULL,
    [Email] [nvarchar](50) NULL,
    [Age] [int] NULL
) ON [PRIMARY]

 参考資料

http://pg.4696.info/db/mssql/paging2.html
http://d.hatena.ne.jp/machi_pon/20060706/1152188496
http://www.ipentec.com/document/document.aspx?page=mssql-sql-offset-and-count
http://blog.livedoor.jp/mitten_line/archives/51510381.html
http://japan.internet.com/developer/20060725/25.html
http://msdn.microsoft.com/ja-jp/library/ms186734(v=SQL.105).aspx

 関連記事

Window関数 ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/02/22/000000
Window関数 ~ ROW_NUMBER / RANK + PARTITION BY ~
https://dk521123.hatenablog.com/entry/2021/03/11/210937
Window関数 ~ LAG / LEAD ~
https://dk521123.hatenablog.com/entry/2021/09/10/092850
Window関数 ~ RANK / DENSE_RANK ~
https://dk521123.hatenablog.com/entry/2012/08/15/225233