SQL: Выбрать строки с максимальной датой и вывести данные из остальных столбцов

Задача проста и стара как мир:

  • Нужно выбрать 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Яндекс.Метрика