ウィンドウ関数 ROW_NUMBER() 関数で連番を振る
Oracle はウィンドウ関数をサポートしていて非常に強力な SQL を 簡単に実行することが出来ます。そのウィンドウ関数を使って、任意の並び順のレコードに行番号を振ってみます。複雑なクエリーを組めば出来ないこともないですが、慣れればウィンドウ関数のほうが直感的にわかりやすく パフォーマンスも良いです。
ウィンドウ関数を使うには、OVER 句を使うことによってウィンドウ関数として扱われます。ウィンドウ関数は問い合わせ結果に含まれる行だけでなく、それ以上の行にアクセスすることができます。
テストデータの準備
まず人口が多い上位30カ国の順位データを以下のように用意しました。 なお "rank" 列の順位は世界で人口の多いランキング順位を示しています。CREATE TABLE population (
rank number,
country varchar2(20) NOT NULL,
region varchar2(20),
population number
);
SQL> SELECT * FROM population;
RANK COUNTRY REGION POPULATION
---------- -------------------- -------------------- ----------
1 China Asia 1409517397
2 India Asia 1339180127
3 United States Americas 324459463
4 Indonesia Asia 263991379
5 Brazil Americas 209288278
6 Pakistan Asia 197015955
7 Nigeria Africa 190886311
8 Bangladesh Asia 164669751
9 Russia Europe 143989754
10 Mexico Americas 129163276
11 Japan Asia 127484450
12 Ethiopia Africa 104957438
13 Philippines Asia 104918090
14 Egypt Africa 97553151
15 Vietnam Asia 95540800
16 Germany Europe 82114224
17 Congo Africa 81339988
18 Iran Asia 81162788
19 Turkey Asia 80745020
20 Thailand Asia 69037513
21 United Kingdom Europe 66181585
22 France Europe 64979548
23 Italy Europe 59359900
24 Tanzania Africa 57310019
25 South Africa Africa 56717156
26 Myanmar Asia 53370609
27 South Korea Asia 50982212
28 Kenya Africa 49699862
29 Colombia Americas 49065615
30 Spain Europe 46354321
30 rows selected.
"rank" 列は既に人口の多い順に順番が付けられていますが、このデータを基に 人口の低い順に連番を付けてみます。
ROW_NUMBER() 関数を使って前の行の値を取得する
ここで使うのは ROW_NUMBER() 関数 と OVER(ORDER BY) です。まず OVER(ORDER BY population) で人口を昇順(人口が少ない順)に並べ替え、次に呼び出される ROW_NUMBER() 関数で連番を振っていきます。以下に SQL と実行結果を記載します。人口の少ない順に1から連番が振られています。
SQL>
SELECT
RANK,
COUNTRY,
REGION,
POPULATION,
ROW_NUMBER() OVER(ORDER BY population) AS line_number
FROM population ;
RANK COUNTRY REGION POPULATION LINE_NUMBER
----- --------------- ---------- ---------- -----------
30 Spain Europe 46354321 1
29 Colombia Americas 49065615 2
28 Kenya Africa 49699862 3
27 South Korea Asia 50982212 4
26 Myanmar Asia 53370609 5
25 South Africa Africa 56717156 6
24 Tanzania Africa 57310019 7
23 Italy Europe 59359900 8
22 France Europe 64979548 9
21 United Kingdom Europe 66181585 10
20 Thailand Asia 69037513 11
19 Turkey Asia 80745020 12
18 Iran Asia 81162788 13
17 Congo Africa 81339988 14
16 Germany Europe 82114224 15
15 Vietnam Asia 95540800 16
14 Egypt Africa 97553151 17
13 Philippines Asia 104918090 18
12 Ethiopia Africa 104957438 19
11 Japan Asia 127484450 20
10 Mexico Americas 129163276 21
9 Russia Europe 143989754 22
8 Bangladesh Asia 164669751 23
7 Nigeria Africa 190886311 24
6 Pakistan Asia 197015955 25
5 Brazil Americas 209288278 26
4 Indonesia Asia 263991379 27
3 United States Americas 324459463 28
2 India Asia 1339180127 29
1 China Asia 1409517397 30
30 rows selected.
このようにウィンドウ関数を使用すると非常に簡単にレコードに対して連番を振ることが可能です。
