no - order by
в оконной функции и предложение order by
оператора select
являются функционально двумя разными вещами.
Кроме того, ваше утверждение выдает: ERROR: window function call requires an OVER clause
, поэтому:
SELECT 30+row_number(ORDER BY salary DESC) AS position, * FROM users ORDER BY salary DESC LIMIT 30 OFFSET 30
должно быть:
SELECT 30+row_number() OVER(ORDER BY salary DESC) AS position, * FROM users ORDER BY salary DESC LIMIT 30 OFFSET 30
Обратите внимание, что если зарплаты не являются уникальными, то нетгарантировать, что они будут даже производить тот же заказ.Возможно, было бы лучше сделать:
SELECT *
FROM ( SELECT 30+row_number() OVER(ORDER BY salary DESC) AS position, *
FROM users )
ORDER BY position LIMIT 30 OFFSET 30
Также обратите внимание, что если вы выполняете этот запрос несколько раз с разными смещениями, вам необходимо:
- установить уровень изоляции до сериализуемого
- убедитесь, что все, что вы заказываете, является уникальным
, иначе вы можете получить дубликаты и пропущенные строки.См. Комментарии к этому ответу , почему