Задача проста и стара как мир:
- Нужно выбрать ID c максимальной датой для каждого ID_FIRM, если максимальные даты одинаковы, то выбрать наибольший ID
- То есть результат должен быть 3, 6, 8
- Как можно меньше пустых переборов
- В финальном результате должны быть все три столбца
Задача на современный лад решается с помощью оконных функций с нумерацией:
select
ID_FIRM,
ID,
SCAN_DOC_NUM,
SCAN_DOC_DATE,
VALID_UNTIL_DATE,
ROW_NUMBER() OVER (PARTITION BY ID_FIRM ORDER by SCAN_DOC_DATE DESC, ID DESC ) AS num
from SCAN_DOC
where
ID_SCAN_DOC_TYPE = 10
Далее нужно «забрать» только строки с num = 1
В частности, чтобы дополнительно получить информацию из таблицы фирм, нужно сделать объединение с вложенной выборкой:
select * from firm f
left join
(
select
id_firm,
id,
SCAN_DOC_NUM,
SCAN_DOC_DATE,
VALID_UNTIL_DATE,
ROW_NUMBER() OVER (PARTITION BY ID_FIRM ORDER by SCAN_DOC_DATE DESC, ID DESC ) AS num
from scan_doc
where ID_SCAN_DOC_TYPE = 10
) s on s.id_firm = f.id_firm and s.num = 1
Не забудьте создать индексы для столбцов, в моём случае ID_SCAN_DOC_TYPE, SCAN_DOC_DATE, ID, ID_FIRM.