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-10
SELECT
row_limiting_clause
http://docs.oracle.com/cd/E57425_01/121/SQLRF/statements_10002.htm#BABHFGAA
row_limiting_clauseを使用すると、問合せから返される行数を制限できます。
オフセットと、返される行数または行数の割合を指定できます。
この句は、上位N番のレポートを実装するために使用できます。
結果の一貫性を保つには、order_by_clauseを指定して、ソート順序を決定的にします。