ねら~ITエンジニア雑記

やきうのお兄ちゃんが綴るOracle Databaseメインのブログ

SQL の FETCH FIRST n ROWS構文で Top n や 同ソートキー値のレコードを抽出する。(Oracle Database 12c)

Oracle Database 12c で追加された FETCH FIRST n ROWS構文を使うと、
Top n や 同ソートキー値のレコードを抽出できるんやで彡(゚)(゚)

サンプルは以下のデータ

SELECT MIN(C1)            AS C1_MIN
     , MAX(C1)            AS C1_MAX
     , COUNT(C1)          AS C1_CNT
     , COUNT(DISTINCT C1) AS C1_NUM_DISTINCT
  FROM TBL_A;

    C1_MIN     C1_MAX     C1_CNT C1_NUM_DISTINCT
---------- ---------- ---------- ---------------
         1      10000      10001           10000

SELECT C1, C2
  FROM TBL_A
 WHERE C1 = 3;

        C1 C2
---------- ----------
         3 REC3
         3 RECCHOFUKU ★C1=3のレコードのみ重複

以下のSQLでTop n(例はTop 3)を抽出彡(゚)(゚)

-- Top 3 を抽出
SELECT C1, C2
  FROM TBL_A
 ORDER BY C1 FETCH FIRST 3 ROWS ONLY;

        C1 C2
---------- ----------
         1 REC1
         2 REC2
         3 REC3

OFFSET句を使って6個目〜10個目のレコードを抽出彡(゚)(゚)
※OFFSET句はORDER BYのキー値重複を考慮しないから、ランキングには使い辛いのか。。。彡(-)(-)

-- 6個目〜10個目のレコードを抽出
SELECT C1, C2
  FROM TBL_A
 ORDER BY C1 OFFSET 5 ROWS FETCH FIRST 5 ROWS ONLY;

        C1 C2
---------- ----------
         5 REC5
         6 REC6
         7 REC7
         8 REC8
         9 REC9

※◎の5レコードを飛ばして★の部分のレコードを抽出している。
        C1 C2
---------- ----------
         1 REC1   ◎
         2 REC2   ◎
         3 REC3   ◎
         3 RECCHOFUKU◎
         4 REC4   ◎
         5 REC5 ★
         6 REC6 ★
         7 REC7 ★
         8 REC8 ★
         9 REC9 ★
        10 REC10
        11 REC11

下記のように3位3個目のレコードのみ抽出も可能やで彡(゚)(゚)

-- 3個目のみ抽出
SELECT C1, C2
  FROM TBL_A
 ORDER BY C1 OFFSET 2 ROWS FETCH FIRST 1 ROWS ONLY;

        C1 C2
---------- ----------
         3 REC3


上記例だと同ソートキー値の他レコードは出ていないんやけど、
ONLY ⇒ WITH TIES に変更すると同ソートキー値のレコードも抽出されるで彡(゚)(゚)

-- Top3(同順位含む)
SELECT C1, C2
  FROM TBL_A
 ORDER BY C1 FETCH FIRST 3 ROWS WITH TIES;

        C1 C2
---------- ----------
         1 REC1
         2 REC2
         3 REC3
         3 RECCHOFUKU

-- 3個目のみ抽出(同キーの他レコード含む)
SELECT C1, C2
  FROM TBL_A
 ORDER BY C1 OFFSET 2 ROWS FETCH FIRST 1 ROWS WITH TIES;

        C1 C2
---------- ----------
         3 REC3
         3 RECCHOFUKU

マニュアルも見てクレメンス彡(^)(^)

Oracle Database SQL言語リファレンス 12cリリース1 (12.1) B71278-10SELECT
row_limiting_clause
http://docs.oracle.com/cd/E57425_01/121/SQLRF/statements_10002.htm#BABHFGAA

> row_limiting_clauseを使用すると、問合せから返される行数を制限できます。
> オフセットと、返される行数または行数の割合を指定できます。
> この句は、上位N番のレポートを実装するために使用できます。
> 結果の一貫性を保つには、order_by_clauseを指定して、ソート順序を決定的にします。

Qiitaにも書いたやで彡(゚)(゚)

SQL の FETCH FIRST n ROWS構文で Top n や
同ソートキー値のレコードを抽出する。(Oracle Database 12c)
http://qiita.com/ora_gonsuke777/items/7ac5d4579b7c3c322dcc