#OFFSETがありません
PostgreSQLでは、非常に便利なOFFETという物が有ります。使い方としては、ORDER BYでソート基準を定義し、LIMITで取得行数の上限を規定し、OFFSETで読み飛ばす行数を指定します。1ページに100行分のデータを出力したい場合、2ページ目ではOFFSET 100 と書くだけで、先頭から101行から取得が可能です。
RDBでもPostgreSQLのみの実装なので違和感を覚えない人もいるかと思います。
一方で、oracleでは行番号を取得するrownumがあります。rownumはネストせずにWHERE句に記述可能でこちらも非常に便利です
#WINDOW関数を用いた出力開始行数を指定する
Oracleのrownumのように行番号を直接取得するような便利な物は無さそうでしたので、Window関数で行番号を採番し、上位階層で行番号を用いて読み飛ばす行数を指定します。
PostgreSQLでOFFSET句を用いた場合
SELECT id , user_name , age
FROM table1
ORDER BY id
LIMIT 100 OFFSET 100
Oracleのrownumを用いた場合
SELECT id , user_name , age
FROM table1
WHERE
rownum > 100
ORDER BY id
LIMIT 100
PrestoでWindow関数を用いた例
SELECT
*
FROM
(
SELECT
row_number()OVER( ORDER BY id ) AS rownum
, id , user_name , age
FROM table1
) AS base
WHERE
rownum > 100
LIMIT 100
どちらもid列でソートしています。
Window関数のrow_number()による行番号の採番と、Where句で行番号を用いて取得行をフィルタリングしています。また、WINDOW関数はWHERE句に直接記述することが出来ないので、1度ネストする必要が有ります。