row_number powinno wystarczyć dla Twoich potrzeb.
Uwaga:Zakładam, że Twoja kolumna Date jest prawdziwym typem danych Date lub DateTime, a nie ciągiem w wyświetlonym formularzu. Jeśli to założenie jest błędne, konieczna byłaby dodatkowa manipulacja ciągiem znaków, aby przekonwertować datę na format możliwy do sortowania.
;with cteRowNumber as (
select Date, ProductID, Year, Price,
row_number() over (partition by ProductID, Year order by Date desc) as RowNum
from YourTable
)
select Date, ProductID, Year, Price
from cteRowNumber
where RowNum = 1