SELECT * FROM
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY Product, SubProduct ORDER BY Changed DESC) rn FROM table
)
WHERE rn = 1
ROW_NUMBER() OVER(PARTITION BY Product, SubProduct ORDER BY Changed DESC)
нумерует строки в порядке убывания значения Изменено.Каждый раз, когда меняется комбинация «Продукт + Подпродукт», нумерация перезапускается с 1
. Затем у нас есть внешний запрос, который выбирает все строки, пронумерованные 1
. Причина, по которой это работает, заключается в том, чтодействительно группа.Раздел похож на группу, но мы не теряем строк с помощью этой техники - все строки на входе попадают в выход с добавлением дополнительных данных.Напротив, группа теряет данные;если вы группируете по продуктам и подпродуктам, вы не можете добавить больше столбцов, не добавляя их в ключ группировки, который уничтожает группу, которую вы пытаетесь создать.Единственное, что вы можете сделать со столбцом в запросе на группировку, - запустить на нем агрегатную функцию, но вы не можете сказать «дайте мне максимум измененных и я хочу связанную цену», вы можете только спросить максимальное измененное значение,и максимальная цена (или что-то еще), и они не обязательно приходят из одного ряда