MySQL:提取分组中出现至少3次的最频繁情感值
解决MySQL按文本分组提取高频情感(次数≥3)的问题
我来帮你搞定这个分组统计的需求,针对你给出的示例和要求,我整理了两种可行的SQL方案,适配不同版本的MySQL:
方案一:使用窗口函数(MySQL 8.0及以上版本推荐)
窗口函数是最简洁直观的实现方式,咱们分三步处理:
- 先统计每个
text和emotion组合的出现次数 - 给每个
text下的情感按次数排名 - 筛选出排名第一且次数≥3的结果
WITH emotion_counts AS ( SELECT text, emotion, COUNT(*) AS cnt FROM your_table -- 替换成你的实际表名 GROUP BY text, emotion ), ranked_emotions AS ( SELECT text, emotion, cnt, RANK() OVER (PARTITION BY text ORDER BY cnt DESC) AS rnk FROM emotion_counts ) SELECT text, emotion FROM ranked_emotions WHERE rnk = 1 AND cnt >= 3;
说明
- 用
RANK()而不是ROW_NUMBER()是因为如果某个文本下有多个情感出现次数相同且都是最高(比如都出现3次),RANK()会把它们都保留,更符合“频率最高”的定义;如果只想取其中一个,换成ROW_NUMBER()即可。 - 记得把
your_table替换成你实际的数据表名称。
方案二:兼容MySQL 5.x版本(无窗口函数)
如果你的MySQL版本不支持窗口函数,可以用嵌套子查询实现:
SELECT ec.text, ec.emotion FROM ( -- 第一步:统计每个(text, emotion)的出现次数 SELECT text, emotion, COUNT(*) AS cnt FROM your_table GROUP BY text, emotion ) ec INNER JOIN ( -- 第二步:找出每个text对应的最高出现次数 SELECT text, MAX(cnt) AS max_cnt FROM ( SELECT text, emotion, COUNT(*) AS cnt FROM your_table GROUP BY text, emotion ) temp GROUP BY text ) mc ON ec.text = mc.text AND ec.cnt = mc.max_cnt -- 第三步:筛选最高次数≥3的记录 WHERE ec.cnt >= 3;
验证示例数据
用你给出的示例数据测试时:
nice day分组中happyness出现3次,是最高次数且≥3,会被保留hello分组中所有情感最多出现2次,最高次数<3,会被过滤
最终输出正好符合你的预期:
nice day | happyness
内容的提问来源于stack exchange,提问作者Andrea Lattanzi
相关产品推荐
相关产品推荐

