日期不匹配时加入两个表

时间:2017-12-08 14:10:09

标签: sql teradata

我有两个表客户和客户地址。 CustomerNo和Date上的加入条件。当客户地址表上的日期不匹配或不可用时,我想加入客户地址

上的最新日期
   Customer Table              Customer Address Table
    CustomerNo    Date        CustomerNo      Date       Addr
    123          1/1/2017     123            1/1/2017   sample1
    123          2/1/2017     123            2/1/2017   sample2
    123          2/11/2017
    123          3/1/2017

预期输出

         Final Table 

CustomerNo       Date      Addr
123             1/1/2017   sample1
123             2/1/2017   sample2
122             2/11/2017  sample2
123             3/1/2017   sample2

当客户地址中没有日期时,请与上一个可用日期匹配。

提前致谢。

4 个答案:

答案 0 :(得分:1)

这是一个解决方案。我没有测试,因为我在网上找不到teradata编译器。

基本上,查询获取子查询中的MAX记录,如果日期中没有其他日期,则使用Addr from max record(参见COALESCE)。

SELECT C.CustomerNo,
       C.Date, 
       COALESCE(CA.Addr, CMax.Addr) AS Addr
  FROM Customer C,
       LEFT JOIN Customer_Address CA
              ON (C.CustomerNo = CA.CustomerNo AND 
                  C.Date = CA.Date)
       LEFT JOIN (SELECT CustomerNo, Addr,
                         ROW_NUMBER() OVER (PARTITION BY CustomerNo ORDER BY Date Desc) AS r_num 
                    FROM Customer_Address 
                   GROUP BY CustomerNo) CMax
              ON (C.CustomerNo = CMax.CustomerNo AND
                  CMax.r_num = 1);

答案 1 :(得分:0)

一种方法是子查询:

select c.*,
       (select top 1 address
        from customeraddress ca
        where ca.CustomerNo = c.CustomerNo and ca.date <= c.date
        order by ca.date desc
       ) as address
from customer c;

答案 2 :(得分:0)

首先,您可以在连接条件中使用CASE表达式,如下所示:

on c.date = case when ca.date = c.date then ca.date when [some logic] then [some result] end

正如您所提到的,您的ELSE逻辑是&#34;最后可用的日期&#34;,您需要以某种方式准备此字段,例如在子查询中。

但最好的解决方案是将这个复杂的联接分成几个查询并将它们联合起来。它将在Teradata中更快地运行。

答案 3 :(得分:-1)

SELECT * FROM customer  c FULL OUTER JOIN address  a ON c.date=A.date WHERE a.date!=NULL 

或试试这个

 SELECT * FROM customer  c FULL OUTER JOIN address  a ON c.date=A.date 

尝试此查询。如果有任何评论。

相关问题