• 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;