sql >> Database >  >> RDS >> Sqlserver

SQL-join tegen datumbereiken?

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



  1. Oracle Join-voorwaarde met Top 1

  2. Query om het aantal tabellen te tellen dat ik in MySQL heb

  3. jboss 7 Oracle-gegevensbronconfiguratie

  4. MySQLdb specifiek installeren in python 2.7 op centos