Присоединиться к двум таблицам на основе диапазона дат - PullRequest
0 голосов
/ 30 октября 2018

Я изо всех сил пытаюсь получить ниже логика У меня есть 2 таблицы.

Таблица A

Request#       ReqDate          Amount    Currency
-----------------------------------------------
REQ1234        2017-01-01       100000    INR

Таблица B

ExDate           Conversion      FromCur          ToCur
-----------------------------------------------------
2017-01-03     0.018           INR              USD  
2016-12-20     0.019           INR              USD  
2016-12-21     0.011           INR              USD  
2016-12-22     0.012           INR              USD  
2016-12-23     0.015           INR              USD  
2016-12-24     0.020           INR              USD  
2016-12-25     0.021           INR              USD  

Здесь мне нужно присоединиться к FromCur и Date, чтобы получить соответствующий USD-коэффициент.

Однако, если коэффициент для ReqDate недоступен, проверьте предыдущую дату, если не доступен, проверьте до этой даты.

Точно так же мне нужно проверить за 7 дней до 2016-12-25 и получить этот коэффициент.

Как это сделать? Таким образом, результат должен быть

Req#     Date        Conversion     Amount   Currency    ToCur    USDAmt ExDate
-------------------------------------------------------------------------------  
REQ1234  2017-01-01  0.021          100000   INR         CAD      2100   2016-12-25  

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Для SQL Server Я предлагаю применить оператор, и если вам может понадобиться вернуть NULL, если он не найден, используйте outer apply

select a.*,rate.conversion 
from a
outer apply (
        select top(1) b.conversion
        from b
        where b.fromcur = a.currency and b.date <= a.date
        -- and b.date > dateadd(day,-7,a.date)
        order by b.date desc
       ) as rate

Обратите внимание, что если вам нужно ограничить, насколько далеко вы ищете ставку, используйте дополнительное условие в предложении where, как предложено выше.

Вы можете использовать коррелированный подзапрос в предложении select, но я рекомендую использовать подход, описанный выше.

select a.*
     , (select top(1) b.conversion
        from b
        where b.fromcur = a.currency and b.date <= a.date
        -- and b.date > dateadd(day,-7,a.date)
        order by b.date desc
       ) as conversion
from a
0 голосов
/ 30 октября 2018

Один метод использует коррелированный подзапрос:

select a.*,
       (select b.conversion
        from b
        where b.fromcur = a.currency and b.date <= a.date
        order by b.date desc
        fetch first 1 row only
       ) as conversion
from a
...