编写MySQL查询:按user分组统计同account_service下15分钟内的关联记录数
需求梳理
- 统计范围:当天全量关联记录
- 核心匹配规则:同一
account_service维度下,若当前用户的记录存在其他用户的关联记录,且两条记录的更新时间差满足:其他用户的更新时间晚于当前记录,间隔不超过15分钟,则当前用户对应这条记录计数加1 - 输出要求:按用户维度分组返回总计数,无匹配记录的用户需保留并显示计数0
实现逻辑
- 以全量用户作为基准集合,避免无匹配记录的用户被遗漏
- 对原表做自关联:匹配条件为相同
account_service值、两侧记录所属用户不重复 - 过滤符合时间规则的关联项:计算两侧
updated字段的时间差,仅保留“对侧记录时间晚于当前记录、间隔≤15分钟”的匹配项 - 关联基准用户集合,按用户分组统计匹配记录数
参考实现SQL
WITH all_users AS ( -- 获取全量用户列表作为统计基准 SELECT DISTINCT `user` FROM table_ ), matched_records AS ( -- 匹配符合跨用户、时间间隔规则的记录对 SELECT base.`user`, base.id AS record_id FROM table_ base INNER JOIN table_ related ON base.account_service = related.account_service AND base.`user` != related.`user` -- 时间差计算:关联记录比当前记录晚0-15分钟 AND TIMESTAMPDIFF(MINUTE, base.updated, related.updated) BETWEEN 0 AND 15 ) SELECT au.`user`, COUNT(mr.record_id) AS `count` FROM all_users au LEFT JOIN matched_records mr ON au.`user` = mr.`user` GROUP BY au.`user` ORDER BY au.`user`;
结果验证
结合给定测试数据集执行上述SQL,输出结果和预期完全一致:
| user | count |
|---|---|
| user1 | 2 |
| user2 | 1 |
| user3 | 0 |
若业务规则调整为不区分时间方向、只要两个用户的同
account_service记录时间差绝对值在15分钟内即触发计数,只需将关联条件中的时间差逻辑替换为ABS(TIMESTAMPDIFF(MINUTE, base.updated, related.updated)) <= 15即可。
内容的提问来源于stack exchange,提问作者sqlExec
相关产品推荐
相关产品推荐

