【问题标题】:Joining two tables when dates mismatch日期不匹配时连接两个表
【发布时间】:2023-03-09 03:51:01
【问题描述】:

我有两张表客户和客户地址。加入条件在 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

当客户地址中的日期不可用时,匹配最后可用的日期。

提前致谢。

【问题讨论】:

标签: sql teradata


【解决方案1】:

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

基本上,查询在子查询中获取 MAX 记录,如果日期还没有,则使用来自 max 记录的 Addr(参见 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);

【讨论】:

    【解决方案2】:

    一种方法是子查询:

    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;
    

    【讨论】:

      【解决方案3】:

      首先你可以在连接条件中使用 CASE 表达式,像这样:

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

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

      但最好的解决方案是将这个复杂的连接拆分为几个查询并将它们全部合并。它会在 Teradata 中运行得更快。

      【讨论】:

        【解决方案4】:
        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 
        

        试试这个查询。如果有的话发表评论。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-11
          • 2022-09-26
          • 2015-01-05
          • 1970-01-01
          相关资源
          最近更新 更多