Нумерация строк в PostgreSQL

как получить номер строки в PostgreSQL, когда результаты упорядочены по некоторому столбцу?

например

SELECT 30+row_number() AS position, * 
FROM users 
ORDER BY salary DESC 
LIMIT 30 
OFFSET 30

я предположил, что запрос вернет список следующим образом:

position | name | salary
31       | Joy  | 4500
32       | Katie| 4000
33       | Frank| 3500

на самом деле я должен дублировать ORDER пункт в запрос, чтобы сделать его функциональным:

SELECT 30+row_number(ORDER BY salary DESC) AS position, * 
FROM users 
ORDER BY salary DESC 
LIMIT 30 
OFFSET 30

есть ли другой способ, как вернуть упорядоченные и пронумерованные результаты без необходимости дублирования кода?

Я знаю, что это можно решить с помощью увеличение некоторой переменной в самом приложении, но я хочу сделать это на уровне базы данных и вернуться к уже пронумерованным результатам приложения...

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

обратите внимание, что если зарплаты не уникальный, то нет никакой гарантии, что они будут производить тот же порядок. Может быть, лучше сделать так:--8-->

SELECT * 
FROM ( SELECT 30+row_number() OVER(ORDER BY salary DESC) AS position, * 
       FROM users )
ORDER BY position LIMIT 30 OFFSET 30

Также обратите внимание, что если вы используете этот запрос несколько раз с различными смещениями, вам нужно:

  1. задание уровень изоляции в Serializable
  2. убедитесь, что все, что вы заказываете, уникально

или вы можете получить дубликаты и недостающие строки. См. комментарии по ответ почему.