SQL - 如何从 2 个表中找到每条记录的最接近日期匹配的不同

问题描述 投票:0回答:1

假设我有表1和表2,其中包含以下数据。我想找到表 1(JoiningDt) 中每个 ID 的 Table2.ClosestDt 中可用的下一个最接近的日期匹配项。注意:表 2 中的最接近匹配应大于表 1 的日期,并且 2 个 ID 不能具有相同的最接近匹配(例如:ID 2 应采用值 08-Apr-2024,即使 07-Apr-2024 是最接近的1,因为它已被 ID 1 占用。)

表1:

身份证 加入Dt 文档编号
1 2024 年 4 月 5 日 A123
2 2024 年 4 月 6 日 A123
3 2024 年 4 月 4 日 B123

表2

文档编号 最近Dt
A123 2024 年 4 月 3 日
A123 2024 年 4 月 4 日
A123 2024 年 4 月 7 日
A123 2024 年 4 月 8 日
B123 2024 年 4 月 2 日
B123 2024 年 4 月 5 日

我的预期输出是:

身份证 加入Dt 文档编号 最近Dt
1 2024 年 4 月 5 日 A123 2024 年 4 月 7 日
2 2024 年 4 月 6 日 A123 2024 年 4 月 8 日
3 2024 年 4 月 4 日 B123 2024 年 4 月 5 日

当我尝试左外连接时,我得到

身份证 加入Dt 文档编号 最近Dt
1 2024-04-05 A123 2024-04-07
1 2024-04-05 A123 2024-04-08
2 2024-04-06 A123 2024-04-07
2 2024-04-06 A123 2024-04-08
3 2024-04-04 B123 2024-04-05
select t1.ID,t1.JoiningDt,t1.DocNum, (t2.ClosestDt) from #Table1 t1 left join 
#Table2 t2 on t1.DocNum=t2.DocNum and t2.ClosestDt > t1.JoiningDt

我也尝试使用 rownum,但具有挑战性的部分是获取 id 2 的下一场比赛(8-apr 而不是 7-apr),因为 07-Apr 已被 Id 1 占用。

sql database date closest
1个回答
0
投票

您可以使用相关子查询,您可以在其中选择最近的日期。

取决于数据库系统,您是否也可以应用CROSS APPLY

SELECT t1.ID, t1.JoiningDt, t1.DocNum,
(SELECT ClosestDt FROM Table2 WHERE DocNum = t1.DocNum AND ClosestDt > t1.JoiningDt ORDER ClosestDt  DESC  BY LIMIT 1 ) ClosestDt 
FROM Table1 t1
© www.soinside.com 2019 - 2024. All rights reserved.