Рассмотрим две таблицы:
Сделки, с суммой в иностранной валюте:
Date Amount
========= =======
1/2/2009 1500
2/4/2009 2300
3/15/2009 300
4/17/2009 2200
etc.
ExchangeRates, со значением первичной валюты (допустим, доллары) в иностранной валюте:
Date Rate
========= =======
2/1/2009 40.1
3/1/2009 41.0
4/1/2009 38.5
5/1/2009 42.7
etc.
Курсы обмена могут быть введены для произвольных дат - пользователь может вводить их ежедневно, еженедельно, ежемесячно или нерегулярно.
Чтобы перевести иностранные суммы в доллары, мне необходимо соблюдать эти правила:
а. Если возможно, используйте последний предыдущий курс; поэтому транзакция 2/4/2009 использует ставку за 2/1/2009, а транзакция 3/15/2009 использует ставку за 3/1/2009.
В. Если для предыдущей даты нет ставки, используйте самую раннюю доступную ставку. Таким образом, транзакция на 1/2/2009 использует ставку за 2/1/2009, так как не определена более ранняя ставка.
Это работает...
Select
t.Date,
t.Amount,
ConvertedAmount=(
Select Top 1
t.Amount/ex.Rate
From ExchangeRates ex
Where t.Date > ex.Date
Order by ex.Date desc
)
From Transactions t
... но (1) кажется, что объединение будет более эффективным и элегантным, и (2) оно не касается вышеприведенного правила B.
Есть ли альтернатива использованию подзапроса, чтобы найти подходящую скорость? И есть ли элегантный способ справиться с Правилом B, не привязывая себя к узлам?