【发布时间】:2019-11-08 19:55:03
【问题描述】:
我正在尝试将 Tbl1 匹配(或下一个更大的匹配)从 Tbl1 到 Tbl2。
标准是
- 从 tbl1 中提取所有记录并从 tbl2 中关闭或相等匹配
- 从 tbl2 中查找匹配记录(匹配基于 ClientNo 和/或日期)
- tbl2 匹配应基于大于或等于 tbl1 日期的日期。
- 结果不应有任何来自 tbl1 或 tbl2 的重复项
第一个匹配应该是 tbl2 中大于或等于 tbl1 中 date1 的第一个 date2
如果同一日期有多个记录,则应根据 tbl2 中的 RefNO 选择下一个更大或相等的日期。
tbl1 包含
RecNo ClientNo Date1
-----------------------------
4 1001 2/6/2017
3 1001 2/4/2018
1 1001 2/5/2018
2 1001 2/5/2018
5 1002 3/8/2018
9 1002 3/9/2018
10 1002 4/11/2019
tbl2 包含
RecNo ClientNo Date2 RefNo
-----------------------------------
1 1001 2/5/2017 1
4 1001 2/5/2018 2
2 1001 2/5/2018 4
3 1001 2/6/2018 5
5 1002 3/9/2018 1
6 1002 4/10/2019 2
查询结果
RecNoTbl1 ClientNo Date1 RecNoTbl2 Date2 RefNo
---------------------------------------------------------------
4 1001 2/6/2017 4 2/5/2018 2
3 1001 2/4/2018 2 2/5/2018 4
1 1001 2/5/2018 3 2/6/2018 5
2 1001 2/5/2018 NULL NULL NULL
5 1002 3/8/2018 5 3/9/2018 1
9 1002 3/9/2018 6 4/10/2019 2
10 1002 4/11/2019 NULL NULL NULL
我尝试使用 ROW OVER PARTITION,但没有奏效。
【问题讨论】:
-
第二个表的记录都匹配不上怎么办?
-
请向我们展示您的代码尝试。
-
下面是我的一个客户编号 1001 的代码...没有按预期产生结果 使用 cl as( Select *, ROW_NUMBER() OVER (partition by clientno order by Clientno,date1) as rwno from tbl1 where ClientNo = '1001'), tr as( Select *, ROW_NUMBER() OVER (partition by clientno order by Clientno,date2,refno) as rwno from tbl2 where ClientNo = '1001') select * from Cl left join tr on cl.clientno = tr.ClientNo where tr.date2 >= cl.date1 and cl.rwno = tr.rwno and cl.ClientNo = '1001'
-
@Gordon Linoff ,如果没有匹配的记录,那么它应该为 tbl1 中的所有记录生成 NULL 结果..
标签: sql sql-server