create table test(currency_to varchar(3),currency_from varchar(3),tradedate datetime,traderate decimal(27,7))goinsert into test(currency_to, currency_from, tradedate, traderate)select 'GBP', 'EUR', CURRENT_TIMESTAMP, 1.2UNIONSELECT 'GBP', 'EUR', CURRENT_TIMESTAMP -1, NULLUNIONSELECT 'GBP', 'EUR', CURRENT_TIMESTAMP -2, 2.3UNIONSELECT 'GBP', 'EUR', CURRENT_TIMESTAMP -3, 1.9UNIONSELECT 'GBP', 'EUR', CURRENT_TIMESTAMP -4, 1.6UNIONSELECT 'GBP', 'EUR', CURRENT_TIMESTAMP -5, NULLUNIONSELECT 'GBP', 'EUR', CURRENT_TIMESTAMP -6, 2.4UNIONSELECT 'GBP', 'EUR', CURRENT_TIMESTAMP -7, 1.3UNIONSELECT 'GBP', 'EUR', CURRENT_TIMESTAMP -8, 1.1SELECT currency_to, currency_from, tradedate, CASE WHEN traderate = NULL THEN tradedate = (select previousdaystraderateforsamecurrencymatch) ELSE traderate END FROM test--EXPECTED OUTPUTselect 'GBP', 'EUR', CURRENT_TIMESTAMP, 1.2UNIONSELECT 'GBP', 'EUR', CURRENT_TIMESTAMP -1, 2.3UNIONSELECT 'GBP', 'EUR', CURRENT_TIMESTAMP -2, 2.3UNIONSELECT 'GBP', 'EUR', CURRENT_TIMESTAMP -3, 1.9UNIONSELECT 'GBP', 'EUR', CURRENT_TIMESTAMP -4, 1.6UNIONSELECT 'GBP', 'EUR', CURRENT_TIMESTAMP -5, 2.4UNIONSELECT 'GBP', 'EUR', CURRENT_TIMESTAMP -6, 2.4UNIONSELECT 'GBP', 'EUR', CURRENT_TIMESTAMP -7, 1.3UNIONSELECT 'GBP', 'EUR', CURRENT_TIMESTAMP -8, 1.1
IF OBJECT_ID(N'tempdb..#test') IS NOT NULL DROP TABLE #test; CREATE TABLE #test (currency_to VARCHAR(3), currency_from VARCHAR(3), tradedate DATETIME, traderate DECIMAL(27, 7));INSERT INTO #test (currency_to, currency_from, tradedate, traderate) SELECT 'GBP', 'EUR', CURRENT_TIMESTAMP, 1.2 UNION SELECT 'GBP', 'EUR', CURRENT_TIMESTAMP - 1, NULL UNION SELECT 'GBP', 'EUR', CURRENT_TIMESTAMP - 2, 2.3 UNION SELECT 'GBP', 'EUR', CURRENT_TIMESTAMP - 3, 1.9 UNION SELECT 'GBP', 'EUR', CURRENT_TIMESTAMP - 4, 1.6 UNION SELECT 'GBP', 'EUR', CURRENT_TIMESTAMP - 5, NULL UNION SELECT 'GBP', 'EUR', CURRENT_TIMESTAMP - 6, 2.4 UNION SELECT 'GBP', 'EUR', CURRENT_TIMESTAMP - 7, 1.3 UNION SELECT 'GBP', 'EUR', CURRENT_TIMESTAMP - 8, 1.1;SELECT T.currency_to, T.currency_from, T.tradedate, COALESCE(T.traderate, PriorRate.traderate) AS traderateFROM #test AS T OUTER APPLY (SELECT TOP (1) T2.traderate FROM #test AS T2 WHERE T2.currency_from = T.currency_from AND T2.currency_to = T.currency_to AND T2.traderate IS NOT NULL AND T2.tradedate <= T.tradedate ORDER BY T2.tradedate DESC) AS PriorRate;
SELECT currency_to, currency_from, tradedate, ad.traderateFROM test aCROSS APPLY (SELECT TOP 1 traderate FROM test b WHERE b.tradedate <= a.tradedate AND b.traderate IS NOT NULL AND b.currency_from = a.currency_from AND b.currency_to = a.currency_to ORDER BY b.tradedate DESC) ad;
currency_to currency_from tradedate traderate----------- ------------- ----------------------- ---------------------------------------GBP EUR 2012-12-11 14:35:45.820 1.1000000GBP EUR 2012-12-12 14:35:45.820 1.3000000GBP EUR 2012-12-13 14:35:45.820 2.4000000GBP EUR 2012-12-14 14:35:45.820 2.4000000GBP EUR 2012-12-15 14:35:45.820 1.6000000GBP EUR 2012-12-16 14:35:45.820 1.9000000GBP EUR 2012-12-17 14:35:45.820 2.3000000GBP EUR 2012-12-18 14:35:45.820 2.3000000GBP EUR 2012-12-19 14:35:45.820 1.2000000
SELECT currency_to, currency_from, tradedate, ad.traderateFROM test aCROSS APPLY (SELECT TOP 1 CAST(traderate AS FLOAT) FROM test b WHERE b.tradedate <= a.tradedate AND b.traderate IS NOT NULL AND b.currency_from = a.currency_from AND b.currency_to = a.currency_to ORDER BY b.tradedate DESC) ad(traderate);
currency_to currency_from tradedate traderate----------- ------------- ----------------------- ----------------------GBP EUR 2012-12-11 14:42:05.897 1.1GBP EUR 2012-12-12 14:42:05.897 1.3GBP EUR 2012-12-13 14:42:05.897 2.4GBP EUR 2012-12-14 14:42:05.897 2.4GBP EUR 2012-12-15 14:42:05.897 1.6GBP EUR 2012-12-16 14:42:05.897 1.9GBP EUR 2012-12-17 14:42:05.897 2.3GBP EUR 2012-12-18 14:42:05.897 2.3GBP EUR 2012-12-19 14:42:05.897 1.2