sql - 根据 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 知识非常有限,我不知道该怎么做。
解决方案
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);
推荐阅读
- sql - WHERE 子句中不接受聚合函数
- node.js - 使用 Axios 发送多个 HTTP 请求
- python - Python读取列直到行尾
- barcode - 检查最终字符串中的 ITF 或 Code 128 条码完整性
- c++ - 在斐波那契数列问题中寻找第 N 个数的程序
- java - 如何使用 Java/Spring API 删除 Redis 中的键列表并返回所有键是否删除?
- botframework - [Microsoft Teams bot]聊天频道中不显示通话图标 #1636
- java - 为什么一个用于 MD5 哈希计算的函数对于较小的文件更可取,而对于大文件却效率低下?
- android - 从android studio的布局文件中的字符串数组访问字符串
- angular - 在您的文件夹结构中放置角度服务的最佳位置在哪里?