SQL查询:统计促成客户会面的通话报备记录总数量
解决方案
实现思路
我们需要统计每个用户提交的通话报备(type=1)中,后续存在同一个客户的会面报备(type=2)的总条数,核心逻辑是校验同用户、同客户下是否存在时间更晚的会面报备。推荐使用EXISTS子查询实现,性能更优,也不会出现重复计数的问题。
可直接运行的SQL代码
SELECT r1.user_id, COUNT(r1.id) AS valid_call_report_count FROM reports r1 WHERE r1.type = 1 AND EXISTS ( SELECT 1 FROM reports r2 WHERE r2.user_id = r1.user_id AND r2.customer_id = r1.customer_id AND r2.type = 2 AND r2.created_at > r1.created_at ) GROUP BY r1.user_id ORDER BY r1.user_id;
结果说明
针对你提供的示例数据,上述SQL的运行结果和预期完全一致。如果需要把没有符合条件记录的用户也展示出来(比如用户2显示计数为0),可以使用以下调整后的SQL:
SELECT u.user_id, SUM(CASE WHEN EXISTS ( SELECT 1 FROM reports r2 WHERE r2.user_id = r1.user_id AND r2.customer_id = r1.customer_id AND r2.type = 2 AND r2.created_at > r1.created_at ) THEN 1 ELSE 0 END) AS valid_call_report_count FROM (SELECT DISTINCT user_id FROM reports) u LEFT JOIN reports r1 ON u.user_id = r1.user_id AND r1.type = 1 GROUP BY u.user_id ORDER BY u.user_id;
运行后结果:
| user_id | valid_call_report_count |
|---|---|
| 1 | 3 |
| 2 | 0 |
内容的提问来源于stack exchange,提问作者Ali Salavati
相关产品推荐
相关产品推荐

