row_number deve ser suficiente para suas necessidades.
Observação:estou assumindo que sua coluna Date é um tipo de dados Date ou DateTime verdadeiro e não uma string no formulário que você mostrou. Se essa suposição estiver errada, alguma manipulação de string adicional seria necessária para converter Date em um formato classificável.
;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