ウィンドウ関数 RANK() で順位付け
Oracle データベースはウィンドウ関数をサポートしていて非常に強力な SQL を 簡単に実行することが出来ます。そのウィンドウ関数を使ってランク付けする 方法を試してみます。ウィンドウ関数を使わなくてもサブクエリー等を駆使すればデータの順位付けは出来るのかもしれませんが、恐らくパフォーマンスは非常に悪いでしょう。ウィンドウ関数を使用することによって良いパフォーマンスで簡単にデータの順位付けが出来ます。
ウィンドウ関数を使うには、OVER 句を使うことによってウィンドウ関数として扱われます。ウィンドウ関数は問い合わせ結果に含まれる行だけでなく、それ以上の行にアクセスすることができます。
テストデータの準備
まず人口が多い上位30カ国の順位データを以下のように用意しました。 なお "rank" 列の順位は世界で人口の多いランキング順位を示しています。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.
このデータを基にアジアの国々での人口が多い順にランク付けして順位を求めてみます。 まずアジアの国々だけを選択してみると次のようになっています。
SQL> SELECT * FROM population WHERE region = 'Asia'; RANK COUNTRY REGION POPULATION ----- ------------- -------- ---------- 1 China Asia 1409517397 2 India Asia 1339180127 4 Indonesia Asia 263991379 6 Pakistan Asia 197015955 8 Bangladesh Asia 164669751 11 Japan Asia 127484450 13 Philippines Asia 104918090 15 Vietnam Asia 95540800 18 Iran Asia 81162788 19 Turkey Asia 80745020 20 Thailand Asia 69037513 26 Myanmar Asia 53370609 27 South Korea Asia 50982212 13 rows selected.
ご覧の通り世界の人口順位である "rank" 列の値は飛び飛びになっています。 これにアシアの順位を付けてみたいと思います。
ウィンドウ関数 RANK() で順位付けする
ではアジアでの順位をつけるためにウィンドウ関数である RANK() を使ってみましょう。 SQL は次のようになります。"asia_rank" という列でアシアでの順位を示すことにします。SQL> SELECT RANK, COUNTRY, REGION, POPULATION, RANK() OVER(ORDER BY population DESC) AS asia_rank FROM population WHERE region = 'Asia'; RANK COUNTRY REGION POPULATION ASIA_RANK ----- ------------- -------- ---------- ---------- 1 China Asia 1409517397 1 2 India Asia 1339180127 2 4 Indonesia Asia 263991379 3 6 Pakistan Asia 197015955 4 8 Bangladesh Asia 164669751 5 11 Japan Asia 127484450 6 13 Philippines Asia 104918090 7 15 Vietnam Asia 95540800 8 18 Iran Asia 81162788 9 19 Turkey Asia 80745020 10 20 Thailand Asia 69037513 11 26 Myanmar Asia 53370609 12 27 South Korea Asia 50982212 13 13 rows selected.
これはつまり WHERE 句で region = 'Asia' としてアジアの国だけを絞り込んだ後、 OVER(ORDER BY population DESC) で population の降順でデータを並べ替え、 その並び替えられたデータに対して RANK() 関数で順位をつける、という流れです。
このウィンドウ関数を使えば複雑な SQL を書かなくても簡単にランキングを求められます。