先頭行の取得や上位 n 件 の取得ができる FETCH 句

メモ:  Category:oracle

ROWNUM や ROW_NUMBER に頼ってきた身としては、なかなか思い出せない FETCH 句を定着させるべく、ここにメモしておきたいと思います。

OFFSET / FETCH 句

例えば、賃率設定の履歴を保持するテーブルがあったとします。

このテーブルから最新の賃率を取得したい場合、次のような SQL 文を実行します。

SELECT
     updated
    ,rate
FROM wage_rate
ORDER BY
    updated DESC
FETCH FIRST 1 ROWS ONLY;

FETCH 句は、指定した件数を取得することもできます。

例えば、賃率の設定が年1回行われるとします。このテーブルから 5 年分のデータを取得したい場合、次のような SQL 文を実行します。

SELECT
     updated
    ,rate
FROM wage_rate
ORDER BY
    updated DESC
FETCH FIRST 5 ROWS ONLY;

直近の年を除く過去 5 年間を取得したい場合は、OFFSET を使用します。

SELECT
     updated
    ,rate
FROM wage_rate
ORDER BY
    updated DESC
OFFSET 1 ROWS
FETCH FIRST 5 ROWS ONLY;

ROWS WITH TIES

FETCH FIRST n ROWS ONLY は、指定した行数を返すのですが ORDER BY で指定した順序に同順位が存在した場合に同じだったら抽出したいことがあるかもしれません。

例えば、100m 走の順位で 3 位が 2 人いて 1 位から 3 位までの人を抽出したいといった場合、次のような SQL 文を実行します。

SELECT
     rank
    ,name
    ,time
FROM ateathletics
ORDER BY
    rank
FETCH FIRST 3 ROWS WITH TIES;
rank name time
1 hoge 10.3
2 fuga 10.5
3 piyo 11.1
3 hogera 11.1

bluenote by BBB