今回は、ROWNUMとROW_NUMBER()の使い方について説明します!
データ準備
ROWNUMとROW_NUMBER()を試すためにテーブルを作成し、データを追加します。
-- テーブルの作成
CREATE TABLE employees (
employee_id NUMBER PRIMARY KEY,
employee_name VARCHAR2(50),
department VARCHAR2(50),
salary NUMBER
);
-- データの登録
INSERT
ALL INTO employees
VALUES
(1, '山田太郎', '営業', 500000)
INTO
employees
VALUES
(2, '佐藤花子', '営業', 550000)
INTO
employees
VALUES
(3, '鈴木一郎', '営業', 600000)
INTO
employees
VALUES
(4, '田中次郎', 'マーケティング', 450000)
INTO
employees
VALUES
(5, '渡辺三郎', 'マーケティング', 470000)
INTO
employees
VALUES
(6, '高橋四郎', 'マーケティング', 520000)
INTO
employees
VALUES
(7, '井上五郎', '開発', 650000)
INTO
employees
VALUES
(8, '小林六郎', '開発', 700000)
INTO
employees
VALUES
(9, '森田七郎', '開発', 750000)
INTO
employees
VALUES
(10, '山本八郎', '営業', 520000)
INTO
employees
VALUES
(11, '松本九郎', '営業', 580000)
INTO
employees
VALUES
(12, '加藤十郎', 'マーケティング', 480000)
INTO
employees
VALUES
(13, '中村十一', '開発', 800000)
INTO
employees
VALUES
(14, '石田十二', '営業', 530000)
INTO
employees
VALUES
(15, '小川十三', 'マーケティング', 460000)
SELECT
*
FROM
DUAL;
従業員ID | 姓名 | 部門 | 給料 |
---|---|---|---|
1 | 山田太郎 | 営業 | 500000 |
2 | 佐藤花子 | 営業 | 550000 |
3 | 鈴木一郎 | 営業 | 600000 |
4 | 田中次郎 | マーケティング | 450000 |
5 | 渡辺三郎 | マーケティング | 470000 |
6 | 高橋四郎 | マーケティング | 520000 |
7 | 井上五郎 | 開発 | 650000 |
8 | 小林六郎 | 開発 | 700000 |
9 | 森田七郎 | 開発 | 750000 |
10 | 山本八郎 | 営業 | 520000 |
11 | 松本九郎 | 営業 | 580000 |
12 | 加藤十郎 | マーケティング | 480000 |
13 | 中村十一 | 開発 | 800000 |
14 | 石田十二 | 営業 | 530000 |
15 | 小川十三 | マーケティング | 460000 |
ROWNUMの使い方
下記の記事で一度紹介したのですが、ROWNUMは行番号を取得するための擬似列で、特定の行数だけデータを取得することができます。
ROWNUMは下記のように記述します。
SELECT 列名… FROM テーブル名
WHERE ROWNUM 行数
ROWNUM <= 5 と記述することで5レコードだけ取得することができます。
SELECT
ROWNUM AS "擬似列(ROWNUM)",
employee_id AS "従業員ID",
employee_name AS "姓名",
department AS "部門",
salary AS "給料"
FROM
employees
WHERE
ROWNUM <= 5;
擬似列(ROWNUM) | 従業員ID | 姓名 | 部門 | 給料 |
---|---|---|---|---|
1 | 1 | 山田太郎 | 営業 | 500000 |
2 | 2 | 佐藤花子 | 営業 | 550000 |
3 | 3 | 鈴木一郎 | 営業 | 600000 |
4 | 4 | 田中次郎 | マーケティング | 450000 |
5 | 5 | 渡辺三郎 | マーケティング | 470000 |
ROWNUM = 5 で指定してもレコードの取得はできないので注意しましょう。
※ROWNUMは、各行が結果セットに追加されるその瞬間に番号が付けられるため
もし、5番目のレコードを取得したい場合は、サブクエリを使って全ての行を取得した後に 5番目 と指定する必要があります。
SELECT * FROM (
SELECT
ROWNUM AS "擬似列(ROWNUM)",
employee_id AS "従業員ID",
employee_name AS "姓名",
department AS "部門",
salary AS "給料"
FROM
employees
WHERE
ROWNUM <= 5
)
WHERE "擬似列(ROWNUM)" = 5;
擬似列(ROWNUM) | 従業員ID | 姓名 | 部門 | 給料 |
---|---|---|---|---|
5 | 5 | 渡辺三郎 | マーケティング | 470000 |
ROW_NUMBER()の使い方
ROW_NUMBER()はウィンドウ関数で、指定した順序に基づいて行番号を付与します。
ROW_NUMBER()は下記のように記述します。
ROW_NUMBER() OVER (
PARTITION BY 列名1, 列名2, ...
ORDER BY 列名A ASC | DESC, ...
)
PARTITION BY は特定の列を基にしてデータをグループ分けし、そのグループごとに行番号を1から付け直します。 ORDER BY は指定した列の値に基づき、各行の順序を決定します。
試しに、ROW_NUMBER() を使って部門ごとにグループ化し給料の高い順で並び替えてみます。
SELECT
employee_id AS "従業員ID",
employee_name AS "姓名",
department AS "部門",
salary AS "給料",
ROW_NUMBER() OVER (
PARTITION BY department -- 部門ごとにグループ化
ORDER BY salary DESC -- 給料の降順で行番号を付与
) AS "ROW_NUMBER"
FROM
employees;
従業員ID | 姓名 | 部門 | 給料 | ROW_NUMBER() |
---|---|---|---|---|
6 | 高橋四郎 | マーケティング | 520000 | 1 |
12 | 加藤十郎 | マーケティング | 480000 | 2 |
5 | 渡辺三郎 | マーケティング | 470000 | 3 |
15 | 小川十三 | マーケティング | 460000 | 4 |
4 | 田中次郎 | マーケティング | 450000 | 5 |
3 | 鈴木一郎 | 営業 | 600000 | 1 |
11 | 松本九郎 | 営業 | 580000 | 2 |
2 | 佐藤花子 | 営業 | 550000 | 3 |
14 | 石田十二 | 営業 | 530000 | 4 |
10 | 山本八郎 | 営業 | 520000 | 5 |
1 | 山田太郎 | 営業 | 500000 | 6 |
13 | 中村十一 | 開発 | 800000 | 1 |
9 | 森田七郎 | 開発 | 750000 | 2 |
8 | 小林六郎 | 開発 | 700000 | 3 |
7 | 井上五郎 | 開発 | 650000 | 4 |
ちゃんとに並び替えることができました。
ROWNUMとROW_NUMBER()の違い
特性 | ROWNUM | ROW_NUMBER() |
---|---|---|
種類 | 擬似列 | 分析関数(ウィンドウ関数) |
動作の仕組み | クエリの結果セットに基づいて番号を付与 | ORDER BY やPARTITION BY で順序を制御可能 |
ORDER BY対応 | ORDER BY に関係なく番号を付与 | ORDER BY による並び替えが可能 |
応用例 | 最初の数行を取得するなど単純な用途 | ページネーションや詳細な並び替えに対応 |
まとめ
ROWNUMは、単純な行番号を付与できて並び替えできない。ROW_NUMBER()は特定の順序・条件で柔軟に行番号を付与できるということを覚えておきましょう!
コメント