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 deDatekolom) de kleinst mogelijke waarde zijn.