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

Я использую Firebird, который имеет поле описания для всех системных объектов (таблицы, столбцы, представления, процедуры и параметры, триггеры, и т.д.) Это хорошо, потому что можно легко совместно использовать его с другими (документы идут с базой данных, не отдельно), и Вы никогда не теряете его.

Большая часть администратора. инструменты для Firebird позволяют Вам редактировать эти описания и существуют некоторые специализированные инструменты (как IBDesc, например), которые создают хороший HTML, или PDF сообщает, что можно распечатать (для некоторых или всех таблиц) легко.

27
задан Troy Alford 22 April 2013 в 21:41
поделиться

1 ответ

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

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

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

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

37
ответ дан 28 November 2019 в 05:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: