SSJ Tech Lab - Oracle Database テクニカルラボ

指定列のトップn件を表示する(RANK,ROW_NUMBER関数)

対応バージョン

Oracle Database 11.2-12.1

2016-06-15タイトルを変更、DBA_USERSを順番に並べる例を追加

2016-06-10記事公開

列データの大きい、または小さい順の最初の数件を出力する場合に使用できる関数について説明します。
データの順番に番号の付与が可能な関数を使用することで、指定した件数に絞る事が出来ます。

以下DBA_USERSを並び替えた例です。Sから始まるユーザ名をACCOUNT_STATUS毎に、USERNAMEのアルファベットが若い順の番号を付与しています。
ACCOUNT_STATUS毎に上位5件を出力しています。

順番を付与する関数

ランク付けを行うことが可能な関数として、主に以下のような関数があります。

関数 説明
RANK 順位をNUMBER型の番号で戻します。同順があった場合に次の順位を飛ばします。(1位、1位、3位、4位と続きます)
DENSE_RANK 順位をNUMBER型の番号で戻します。同順があった場合に次の順位を飛ばしません。(1位、1位、2位、3位と続きます)
ROW_NUMBER 順番をNUMBER型の番号で戻します。同じ値があった場合でも、別の番号を振ります。(1位が同じ値だったとしても1位、2位、3位、4位と続きます)
参考情報(参考元マニュアル)
RANK関数について
https://docs.oracle.com/cd/E16338_01/server.112/b56299/functions141.htm
DENSE_RANK関数について
https://docs.oracle.com/cd/E16338_01/server.112/b56299/functions052.htm
ROW_NUMBER関数について
https://docs.oracle.com/cd/E16338_01/server.112/b56299/functions156.htm
Oracle Database SQL言語リファレンス
11gリリース2 (11.2)
B56299-07

関数の使い方(ランク付け部分のみ)

各関数の構文にて以下の2つを指定します。

関数 説明
PARTITION BY 指定した列でグループ化をします。グループ化した中で1位から順に番号を振ります。
ORDER BY 指定した列でソートを行います。ソートされた順で順位付けを行います。DESCを指定することで逆順にランク付けもできます。

RANK関数を使用した場合のサンプル

ASH(アクティブセッション履歴)の特定の期間のデータをランク付けして出力するサンプルです。
RANK列が1位のものが2つあり、1位の次が3位となっていることが確認できます。

DENSE_RANK関数を使用した場合のサンプル

RANKをDENSE_RANKに変更して実行したサンプルです。

RANK列が1位のものが2つあり、1位の次が2位となっていることが確認できます。

ROW_NUMBER関数を使用した場合のサンプル

ASHから10分毎の待機イベントの状況トップ3を出力するSQLのサンプルです。

副問い合わせ内でorder byを使用する場合

昔ながらのやり方としては、副問い合わせの中で事前ソートを行い、ソートされた行の順番を保証する方法があります。上位n件以下の出力ということをする場合によく使われることが多いです。ただし、ROW_NUMBER関数で示したサンプルのように、グループ化をした中での順位出力が難しくなります。

副問い合わせ(from句の中のSQL)にてorder by句によるソートを行い、ソート内容の上位3番目までを取得するSQLのサンプルです。


関連記事

関連記事が存在しません