LoginSignup
8
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-03-24

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

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

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

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6