On 2012+ you may also want to use analytics with windowing.
declare @prm datetime = '2014-12-04 12:00';
select distinct
PK = LAST_VALUE(PK) OVER ( PARTITION BY Prod, Terminal ORDER BY MarketDate ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
, Prod, Terminal
, cost = LAST_VALUE(Cost) OVER ( PARTITION BY Prod, Terminal ORDER BY MarketDate ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
, marketdate = LAST_VALUE(MarketDate) OVER ( PARTITION BY Prod, Terminal ORDER BY MarketDate ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
from #TestTable
where MarketDate <= @prm;