日期不匹配时连接两个表
Joining two tables when dates mismatch
我有两个 tables 客户和客户地址。加入标准在 CustomerNo 和 Date 上。当客户地址 table 上的日期不匹配或不可用时,我想加入客户地址
上可用的最新日期
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
当客户地址中的日期不可用时,与最后一个可用日期相匹配。
提前致谢。
一种方法是子查询:
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;
首先你可以在连接条件中使用CASE表达式,像这样:
on c.date = case when ca.date = c.date then ca.date when [some logic] then [some result] end
正如您提到的您的 ELSE 逻辑是 "last available date",您需要以某种方式准备此字段,例如在子查询中。
但最好的解决方案是将这个复杂的连接拆分为几个查询并将它们全部合并。它将在 Teradata 中运行得更快。
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
试试这个查询。如果有的话发表评论。
这是一个解决方案。我没有测试过,因为我在网上找不到 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);
我有两个 tables 客户和客户地址。加入标准在 CustomerNo 和 Date 上。当客户地址 table 上的日期不匹配或不可用时,我想加入客户地址
上可用的最新日期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
当客户地址中的日期不可用时,与最后一个可用日期相匹配。
提前致谢。
一种方法是子查询:
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;
首先你可以在连接条件中使用CASE表达式,像这样:
on c.date = case when ca.date = c.date then ca.date when [some logic] then [some result] end
正如您提到的您的 ELSE 逻辑是 "last available date",您需要以某种方式准备此字段,例如在子查询中。
但最好的解决方案是将这个复杂的连接拆分为几个查询并将它们全部合并。它将在 Teradata 中运行得更快。
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
试试这个查询。如果有的话发表评论。
这是一个解决方案。我没有测试过,因为我在网上找不到 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);