首页 > 解决方案 > 根据 ID 和最近日期加入

问题描述

我有两张桌子:

表 1 包含电话呼叫(每个电话每天CustomerID最多一个电话呼叫):

ActicityID  CustomerID   PhoneDate
1           A            2019-11-01
2           A            2019-12-01
3           A            2019-12-20
4           B            2019-11-01
5           B            2019-11-20
6           C            2019-11-03
7           D            2019-11-03
8           D            2019-12-01
9           E            2019-11-05
10          F            2019-11-01

包含订单的表2(OrdDate是下订单BillingDate的日期,是收取订单的日期)

CustomerID  OrdDate      BillingDate
A           2019-12-03   2019-12-04
A           2019-12-21   2019-12-21
B           2019-11-03   2019-11-10
D           2019-12-02   2019-12-02
F           2019-11-02   2019-11-02

我想加入表格。连接表的行数应该与表 1 相同。所以基本上我想知道电话后是否有订单。问题是,如果只是加入,CustomerID我会为每个曾经下过订单的客户得到一个OrdDat和一个。BillingDate例如,客户 A 在 2019 年 12 月 1 日的电话和 2019 年 12 月 20 日的电话之后下订单,但在第一次电话之后没有。

所以我想要的输出是

ActicityID  CustomerID   PhoneDate    OrdDate     BillingDate 
1           A            2019-11-01   NULL        NULL
2           A            2019-12-01   2019-12-03  2019-12-04
3           A            2019-12-20   2019-12-21  2019-12-21
4           B            2019-11-01   2019-11-03  2019-11-10
5           B            2019-11-20   NULL        NULL
6           C            2019-11-03   NULL        NULL
7           D            2019-11-03   NULL        NULL
8           D            2019-12-01   2019-12-02  2019-12-02
9           E            2019-11-05   NULL        NULL
10          F            2019-11-01   2019-11-02  2019-11-02

我想我需要加入 CustomerID 以及 PhoneDate 和 OrdDate 之间最接近的日期,但我的 SQL 知识非常有限,我不知道该怎么做。

标签: sqlsql-server

解决方案


lead()我认为您可以通过使用获取下一个电话日期然后加入来做您想做的事情:

select a.*, b.orddate, b.billdate
from (select a.*,
             lead(phonedate) over (partition by customerid order by phonedate) as next_pd
      from a
     ) a left join
     b
     on b.customerid = a.customerid and
        b.orddate >= a.phonedate and
        (b.orddate < a.next_pd or a.next_pd is null);

推荐阅读