Сортировка записей
Листинг 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 означает сортировку по первому полю итогового набора.