DISTINCT ON
Конструкция SQL
Оставляет по одной строке для каждого значения выражений в скобках — первую по порядку ORDER BY.
PostgreSQL 17.5
SELECT DISTINCT ON (expression[, ...]) column[, ...] FROM table ORDER BY expression[, ...]Параметры
- expression
- Выражения, по которым строки считаются повторами
- column
- Столбцы результата
- tableимя
- Таблица, из которой выбираются строки
- ORDER BY
- Порядок строк: начинается с тех же выражений, что в DISTINCT ON, а следующие столбцы решают, какая строка останется
Возвращаемое значение
Набор строк: по одной на каждое уникальное значение expression
Примеры
Самый старший в каждом статусе
PostgreSQL 17.5
SELECT DISTINCT ON (status) status,
member_name,
birthday
FROM FamilyMembers
ORDER BY status,
birthday;Последний платёж каждого члена семьи
PostgreSQL 17.5
SELECT DISTINCT ON (family_member) family_member,
date,
good,
unit_price
FROM Payments
ORDER BY family_member,
date DESC;Подробности
Это расширение PostgreSQL: в MySQL ту же задачу решают через ROW_NUMBER() в подзапросе.
Без ORDER BY оставшаяся строка выбирается произвольно. Если ORDER BY начинается с других выражений, запрос завершается ошибкой.