PrestoにはrownumもOFFSETも無い


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度ネストする必要が有ります。