SQL如何查询过去1年内任意2天窗口期内发言超过6次的人员
需求实现SQL方案
前提说明
假设原始表名为user_comment,字段对应关系如下:
comment_date:发言日期,日期类型speaker:发言人comment_id:评论唯一ID
实现思路
- 先过滤过去1年的有效发言数据
- 按发言人、发言日期聚合,统计每个用户每天的发言次数
- 对聚合后的每日统计结果做自关联,匹配同一用户相邻两天的发言数据
- 计算两天累计发言次数,筛选出累计超过6次的记录,按要求格式化输出
具体SQL代码
WITH daily_speak_cnt AS ( -- 统计每个用户每天的发言次数,过滤过去1年数据 SELECT speaker, comment_date, COUNT(comment_id) AS daily_cnt FROM user_comment WHERE comment_date >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR) -- 不同数据库时间函数可对应替换,比如PostgreSQL可替换为CURRENT_DATE - INTERVAL '1 year' GROUP BY speaker, comment_date ) -- 匹配相邻两天数据,计算累计次数后输出结果 SELECT CONCAT( t1.speaker, ':', t1.comment_date, ' & ', t2.comment_date, ',共', (t1.daily_cnt + t2.daily_cnt), '次' ) AS result FROM daily_speak_cnt t1 INNER JOIN daily_speak_cnt t2 ON t1.speaker = t2.speaker AND DATEDIFF(t1.comment_date, t2.comment_date) = 1 -- 保证t1是较晚日期,t2是前一天 WHERE t1.daily_cnt + t2.daily_cnt > 6 ORDER BY t1.speaker, t1.comment_date DESC;
结果验证
针对你提供的示例数据,执行上述SQL会输出符合要求的结果:
- A:2021-10-20 & 2021-10-19,共6次
- B:2021-10-19 & 2021-10-18,共7次
不符合次数要求的记录会自动被WHERE条件过滤。
内容的提问来源于stack exchange,提问作者user16462786
相关产品推荐
相关产品推荐

