根据日期范围联接两个表

时间:2018-10-30 01:56:43

标签: sql amazon-redshift

我正在努力获得以下逻辑。 我有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才能获得相应的美元转换因子。

但是,如果ReqDate的因子不可用,请检查上一个日期,如果该日期之前不可用,请检查。

同样,我需要检查2016年12月25日之前的7天,并获取该系数。

如何执行此操作? 所以结果应该是

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

2 个答案:

答案 0 :(得分:1)

一种方法使用相关的子查询:

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

答案 1 :(得分:0)

对于 SQL Server ,我建议使用Apply运算符,如果您可能需要返回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
相关问题