You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL:提取分组中出现至少3次的最频繁情感值

解决MySQL按文本分组提取高频情感(次数≥3)的问题

我来帮你搞定这个分组统计的需求,针对你给出的示例和要求,我整理了两种可行的SQL方案,适配不同版本的MySQL:

方案一:使用窗口函数(MySQL 8.0及以上版本推荐)

窗口函数是最简洁直观的实现方式,咱们分三步处理:

  1. 先统计每个text和emotion组合的出现次数
  2. 给每个text下的情感按次数排名
  3. 筛选出排名第一且次数≥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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:35:09