Как работают расширенные столбцы ключей сортировки
Логический порядок операций в SQL для вашего первого запроса (упрощенный):
FROM abc_test
SELECT n_num, k_str
т.е. добавить так называемый расширенный столбец ключа сортировки ORDER BY k_str DESC
SELECT n_num
т.е. удалить расширенную сортировку ключевой столбец снова из результата.
Благодаря стандартной функции SQL расширенный столбец ключа сортировки можно упорядочить что-то, чего нет в SELECT
пункт, потому что он временно добавляется к нему за кулисами до заказа, а затем снова удаляется после заказа.
Итак, почему это не работает с DISTINCT
?
Если мы добавим операцию DISTINCT
, ее нужно будет добавить между SELECT
и ORDER BY
:
FROM abc_test
SELECT n_num, k_str
т.е. добавить так называемый расширенный столбец ключа сортировки DISTINCT
ORDER BY k_str DESC
SELECT n_num
т.е. удалить столбец расширенного ключа сортировки снова из результата.
Но теперь, с расширенным столбцом ключа сортировки k_str
, семантика операции DISTINCT
была изменена, поэтому результат больше не будетбыть таким же.Это не то, что нам нужно, поэтому и стандарт SQL, и все разумные базы данных запрещают это использование.
Временные решения
PostgreSQL имеет синтаксис DISTINCT ON
, который можно использовать здесь именно для этогоjob:
SELECT DISTINCT ON (k_str) n_num
FROM abc_test
ORDER BY k_str DESC
Его можно эмулировать со стандартным синтаксисом следующим образом, если вы не используете PostgreSQL
SELECT n_num
FROM (
SELECT n_num, MIN(k_str) AS k_str
FROM abc_test
GROUP BY n_num
) t
ORDER BY k_str
Или просто (в данном случае)
SELECT n_num, MIN(k_str) AS k_str
FROM abc_test
GROUP BY n_num
ORDER BY k_str
Я уже писал о SQL DISTINCT и ORDER BY более подробно здесь .