如何过滤同一客户首次呼叫5分钟内的重复挂断呼叫数据?
修正SQL以实现同一客户5分钟内重复呼叫的过滤统计
咱们先拆解下你的需求核心:对每个客户,只保留首次挂断呼叫,剔除首次呼叫后5分钟内的所有后续重复呼叫。你原来的SQL没达到效果,主要是两个关键逻辑错误,咱们一步步来修正:
原来SQL的问题分析
- 没有按客户分组计算时间差:你用
lag()的时候只按CREATE_DATE_TIME全局排序,这会导致你对比的是全局上一条呼叫的时间,而不是同一个客户的上一次呼叫时间——完全偏离了业务规则。 - 窗口函数不能直接用在WHERE子句:多数SQL方言(比如你用的SQL Server)不允许窗口函数直接出现在WHERE里,而且你也没处理「客户首次呼叫」的情况(首次呼叫没有上一条记录,应该直接保留)。
修正后的SQL实现
我们用CTE(公共表表达式)先预处理每个客户的呼叫序列,再筛选符合规则的记录:
WITH customer_calls AS ( SELECT CREATE_DATE_TIME, -- 保留你原来的Number提取逻辑 RIGHT(LEFT([SUBJECT], 16), 11) AS Number, -- 按客户号码分组,按呼叫时间排序,取该客户的上一次呼叫时间 LAG(CREATE_DATE_TIME) OVER ( PARTITION BY RIGHT(LEFT([SUBJECT], 16), 11) ORDER BY CREATE_DATE_TIME ) AS previous_call_time FROM [server1].[Database].[Schema].[call_list] ) SELECT CREATE_DATE_TIME, Number FROM customer_calls -- 筛选规则:要么是该客户的首次呼叫,要么和上一次呼叫间隔超过5分钟 WHERE previous_call_time IS NULL OR DATEDIFF(mi, previous_call_time, CREATE_DATE_TIME) > 5 ORDER BY CREATE_DATE_TIME;
关键逻辑说明
PARTITION BY Number:这是核心!让lag()函数只在同一个客户的呼叫记录里找上一条,确保时间差对比的是同一个客户的两次呼叫。- 筛选条件:
previous_call_time IS NULL:保留每个客户的第一次呼叫(没有历史记录,必须计入)DATEDIFF(mi, previous_call_time, CREATE_DATE_TIME) > 5:只保留和该客户上一次呼叫间隔超过5分钟的后续呼叫
- 去掉了多余的
DISTINCT:只要原始数据里每条呼叫记录是唯一的,就不需要去重——你的重复问题根源是分组逻辑错误,不是记录重复。
测试你的样本数据
用你给出的测试数据跑这个SQL,会得到你期望的结果:
2019-06-03 09:10:56.0 100037729
2019-06-03 09:10:58.0 100134657
2019-06-03 09:10:59.0 101401435
2019-06-03 09:11:01.0 104925349
内容的提问来源于stack exchange,提问作者Flaniganga
相关产品推荐
相关产品推荐

