如何通过SQL获取最后请求未被处理的client_id列表?
问题分析与SQL解决方案
需求明确
需要筛选出最后一次任务请求未被处理的client_id列表,判断规则:
- 若客户的最后一条任务的
created_datetime之后,存在任何call_datetime晚于该时间的通话记录,视为已处理 - 反之(无后续通话,或根本没有通话记录),视为未处理
原SQL存在的问题
你提供的SQL存在几个核心逻辑错误:
- 使用
JOIN会直接过滤掉没有通话记录的客户,但这类客户属于未处理范畴,应该被保留 GROUP BY client_id, call_datetime分组逻辑错误,会按每个通话时间拆分分组,无法聚合客户的最后任务时间与最后通话时间- 计算两个最大值的时间差对需求无意义,我们需要的是对比客户最后一次任务时间和其所有通话的最晚时间
正确SQL写法
SELECT t.client_id FROM ( -- 获取每个客户的最后一次任务创建时间 SELECT client_id, MAX(created_datetime) AS last_task_time FROM tasks GROUP BY client_id ) t LEFT JOIN ( -- 获取每个客户的最后一次通话时间 SELECT client_id, MAX(call_datetime) AS last_call_time FROM calls GROUP BY client_id ) c ON t.client_id = c.client_id -- 筛选未处理的客户:无通话记录,或最后任务时间晚于最后通话时间 WHERE c.last_call_time IS NULL OR t.last_task_time > c.last_call_time;
逻辑说明
- 子查询
t:聚合每个客户的最后一次任务创建时间,确保我们只关注客户的最后一条请求 - 子查询
c:聚合每个客户的最后一次通话时间,用LEFT JOIN保证没有通话记录的客户不会被过滤 WHERE条件:精准匹配需求中的未处理场景,覆盖“无通话”和“有通话但最后任务在通话之后”两种情况
内容的提问来源于stack exchange,提问作者slavabuu
相关产品推荐
相关产品推荐

