Ответ 1
нет - 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
Также обратите внимание, что если вы выполняете этот запрос несколько раз с разными смещениями, вам необходимо:
- установите уровень изоляции для сериализации
- убедитесь, что все, что вы заказываете, уникально
или вы можете получить дубликаты и отсутствующие строки. См. Комментарии этого ответа для чего.