Je zou eerst een self-join kunnen doen op de wisselkoersen die op datum zijn geordend, zodat je de begin- en de einddatum van elke wisselkoers hebt, zonder enige overlap of hiaat in de datums (misschien voeg je die als weergave toe aan je database - in mijn geval gebruik ik gewoon een algemene tabeluitdrukking).
Nu is het eenvoudig en efficiënt om die "voorbereide" tarieven bij de transacties te voegen.
Iets als:
WITH IndexedExchangeRates AS (
SELECT Row_Number() OVER (ORDER BY Date) ix,
Date,
Rate
FROM ExchangeRates
),
RangedExchangeRates AS (
SELECT CASE WHEN IER.ix=1 THEN CAST('1753-01-01' AS datetime)
ELSE IER.Date
END DateFrom,
COALESCE(IER2.Date, GETDATE()) DateTo,
IER.Rate
FROM IndexedExchangeRates IER
LEFT JOIN IndexedExchangeRates IER2
ON IER.ix = IER2.ix-1
)
SELECT T.Date,
T.Amount,
RER.Rate,
T.Amount/RER.Rate ConvertedAmount
FROM Transactions T
LEFT JOIN RangedExchangeRates RER
ON (T.Date > RER.DateFrom) AND (T.Date <= RER.DateTo)
Opmerkingen:
-
Je zou
GETDATE()
. kunnen vervangen met een datum in de verre toekomst, neem ik hier aan dat er geen tarieven voor de toekomst bekend zijn. -
Regel (B) wordt geïmplementeerd door de datum van de eerste bekende wisselkoers in te stellen op de minimale datum die wordt ondersteund door de SQL Server
datetime
, wat zou moeten (per definitie als het het type is dat u gebruikt voor deDate
kolom) de kleinst mogelijke waarde zijn.