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