SQL запрос по максимальному значению в столбце таблицы с учетом других столбцов

Рейтинг: 0Ответов: 2Опубликовано: 01.02.2023

Есть таблица Documents -

id general_id Doc_Type Doc_version
1 101 13 1
2 101 13 2
3 101 14 1
4 101 14 2
5 101 14 3
6 101 15 1
7 102 13 1
8 102 13 2

Необходим запрос sql по которому нужно выбрать по каждому general_id и Doc_type строки с максимальной значением в Doc_version. В результате должно получиться -

id general_id Doc_Type Doc_version
2 101 13 2
5 101 14 3
6 101 15 1
8 102 13 2

Есть ли кого-то идеи как это сделать?

Ответы

▲ 1Принят

В современных СУБД есть оконная функция row_number, позволяющая пронумеровать строки внутри группы.

Группируем по general_id и doc_type, нумеруем по doc_version по убыванию, и в каждой группе оставляем только первую строку.

Так как в большинстве СУБД row_number нельзя использовать в условии WHERE напрямую, нужно сделать подзапрос и вывести номер строки как новый столбец:

SELECT id, general_id, doc_type, doc_version
FROM (
  SELECT
    id, general_id, doc_type, doc_version,
    ROW_NUMBER() OVER (PARTITION BY general_id, doc_type ORDER BY doc_version DESC) AS RN
   FROM Documents
) D
WHERE RN = 1
▲ 0

Попробуй так

SELECT general_id, Doc_type, max(doc_version) AS Doc_version
FROM Documents
GROUP BY general_id, Doc_type