row_number dovrebbe essere sufficiente per le tue esigenze.
Nota:presumo che la tua colonna Date sia un tipo di dati Date o DateTime vero e non una stringa nel modulo che hai mostrato. Se tale presupposto è errato, sarebbe necessaria una manipolazione aggiuntiva della stringa per convertire la data in un formato ordinabile.
;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