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

Есть таблица 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

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


Ответы (2 шт):

Автор решения: Alexandr

Попробуй так

SELECT general_id, Doc_type, max(doc_version) AS Doc_version
FROM Documents
GROUP BY general_id, Doc_type
 
→ Ссылка
Автор решения: Герман Борисов

В современных СУБД есть оконная функция 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
→ Ссылка