Иллюстрированный самоучитель по PostgreSQL

Сортировка записей

Листинг 4.43. Секция ORDER BY с несколькими выражениями.

booktown=# SELECT edition, publication
booktown-# FROM editions
booktown-# ORDER BY edition ASC,
booktown-# publication DESC;
edition | publication
1 | 1995-03-28
1 | 1987-03-01
1 | 1981-08-01
1 | 1958-01-01
1 | 1957-03-01
1 | 1957-01-01
1 | 1949-03-01
1 | 1947-03-04
1 | 1922-01-01
1 |1868-01-01
2 | 2001-03-01
2 | 1998-12-01
2 | 1998-09-01
2 | 1993-10-01
3 | 2000-09-12
3 | 1999-10-01
3 | 1999-10-01
(17 rows)

Запрос выбирает поля edition и publication всех записей таблицы editions. Затем секция ORDER BY определяет два поля, по которым должна осуществляться сортировка результата: edition (по возрастанию) и publication (по убыванию).

Как видно из результатов в листинге 4.43, сначала записи сортируются по номеру издания, а при совпадении номеров дальнейшая сортировка осуществляется по дате публикации – от новых к старым.

Сортировка играет важную роль при использовании ключевого слова DISTINCT, упоминавшегося в подразделе "Удаление дубликатов и ключевое слово DISTINCT". Если вы хотите ограничиться просмотром последнего издания для каждого значения поля edition таблицы editions, комбинация ORDER BY и DISTINCT позволит добиться эффекта, аналогичного применению секции GROUP BY (листинг 4.44).

Листинг 4.44. Использование секции DISTINCT с ORDER BY.

booktown=# SELECT DISTINCT ON (edition)
booktown-# edition, publication
booktown-# FROM editions
booktown-# ORDER BY edition ASC,
booktown-# publication DESC;
edition | publication
1 | 1995-03-28
2 | 2001-03-01
3 | 2000-09-12
(3 rows)

booktown=# SELECT edition, max(publication)
booktown-# FROM editions
booktown-# GROUP BY edition;
edition | max
1 | 1995-03-28
2 | 2001-03-01
3 | 2000-09-12
(3 rows)

Поскольку секция ORDER BY обрабатывается перед удалением дубликатов ключевым словом DISTINCT, общий эффект очень похож на вызов агрегатной функции max() или min() в секции GROUP BY. Подобная методика бывает чрезвычайно эффективной, хотя все зависит от сложности агрегирования и сортировки.

Примечание
Вместо имен полей или выражений секция ORDER BY может содержать целочисленные константы. Такие константы интерпретируются как номера позиций в целевом списке; отсчет ведется слева направо, начиная с 1. Таким образом, ORDER BY 1 ASC означает сортировку по первому полю итогового набора
.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.