You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤同一客户首次呼叫5分钟内的重复挂断呼叫数据?

修正SQL以实现同一客户5分钟内重复呼叫的过滤统计

咱们先拆解下你的需求核心:对每个客户,只保留首次挂断呼叫,剔除首次呼叫后5分钟内的所有后续重复呼叫。你原来的SQL没达到效果,主要是两个关键逻辑错误,咱们一步步来修正:

原来SQL的问题分析

  1. 没有按客户分组计算时间差:你用lag()的时候只按CREATE_DATE_TIME全局排序,这会导致你对比的是全局上一条呼叫的时间,而不是同一个客户的上一次呼叫时间——完全偏离了业务规则。
  2. 窗口函数不能直接用在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:25:28