如何编写SQL按日期范围筛选客户购买前后关联的支持工单数据
按日期、客户维度关联提取数据的SQL实现方案
完全可以通过SQL实现该需求,核心是基于客户ID做两表关联,再通过日期区间判断筛选符合时间要求的工单数据。
前提表结构约定
- 表1:客户购买记录表
purchase_records,核心字段如下customer_id:客户唯一标识(关联用字段,比姓名更准确可避免重名问题)customer_name:客户姓名purchase_date:客户购买商品的日期(DATE/DATETIME类型)- 其余商品、金额等购买相关字段可按需查询
- 表2:客户支持工单表
ticket_records,核心字段如下customer_id:客户唯一标识(和购买表做关联的匹配字段)ticket_submit_time:工单提交时间(DATE/DATETIME类型)- 其余工单编号、问题类型等工单相关字段可按需查询
核心实现逻辑
两表通过customer_id关联,筛选工单提交时间落在「对应客户某笔购买日期前10天 - 购买日期后10天」区间内的记录即可。如果同一客户有多笔购买记录,工单只要匹配任意一笔购买的时间窗口就会被提取,加DISTINCT可避免同一工单匹配多笔购买时重复返回。
可直接复用的SQL代码
MySQL版本
SELECT DISTINCT t.* -- 替换成实际需要返回的字段即可,如需关联展示购买信息可加上p.开头的对应字段 FROM ticket_records t INNER JOIN purchase_records p ON t.customer_id = p.customer_id -- 时间区间判断,可根据实际天数要求调整INTERVAL后的数值 AND t.ticket_submit_time BETWEEN DATE_SUB(p.purchase_date, INTERVAL 10 DAY) AND DATE_ADD(p.purchase_date, INTERVAL 10 DAY);
其他数据库适配提示
- PostgreSQL:将日期计算部分替换为
p.purchase_date - INTERVAL '10 days'和p.purchase_date + INTERVAL '10 days' - SQL Server:将日期计算部分替换为
DATEADD(day, -10, p.purchase_date)和DATEADD(day, 10, p.purchase_date) - Oracle:将日期计算部分替换为
p.purchase_date - 10和p.purchase_date + 10即可
注意事项
- 若业务需要排除周末、法定节假日计算10天窗口,需要额外搭配日历表关联计算工作日,不能直接用自然日加减
- 若不需要去重(比如需要同时返回工单和对应匹配的每一笔购买记录),去掉
DISTINCT关键字即可 - 建议给
customer_id、purchase_date、ticket_submit_time字段加索引,数据量大时查询速度会明显提升
逻辑验证参考:客户Bob在2022年6月1日有螺丝刀购买记录,上述SQL会自动圈定2022年5月22日至2022年6月11日的自然日时间窗口,如果需要匹配示例中提到的2022年5月21日至2022年6月10日窗口,调整INTERVAL后的天数为对应数值即可。
内容的提问来源于stack exchange,提问作者msulol
相关产品推荐
相关产品推荐

