Справочник по функциям

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;
statusmember_namebirthday
daughterLela Quincey1985-06-07
fatherHeadley Quincey1960-05-13
motherFlavia Quincey1963-02-16
sonAndie Quincey1983-06-05

Последний платёж каждого члена семьи

PostgreSQL 17.5
SELECT DISTINCT ON (family_member) family_member,
	date,
	good,
	unit_price
FROM Payments
ORDER BY family_member,
	date DESC;
family_memberdategoodunit_price
12006-03-12510
22005-10-231466000
32006-01-1210100
42005-07-267150
52005-12-2215250

Подробности

Это расширение PostgreSQL: в MySQL ту же задачу решают через ROW_NUMBER() в подзапросе.

Без ORDER BY оставшаяся строка выбирается произвольно. Если ORDER BY начинается с других выражений, запрос завершается ошибкой.

Смотрите также