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

求SQL查询语句:获取每行A1-A4列的众数并按ID展示

解决思路与SQL实现

这需求挺常见的,核心就是把每个ID对应的多列值“扁平化”成多行,再统计频率取最高值就行。下面给你几种适配不同SQL环境的解法:

通用解法(支持窗口函数的数据库:MySQL 8+、PostgreSQL、SQL Server等)

用CTE先把列转成行,再通过窗口函数给每个ID下的数值按出现频率排名,最后取排名第一的:

WITH ranked_vals AS (
    SELECT 
        ID, 
        val,
        -- 按出现次数降序排名,次数相同的话可以加val排序规则
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY COUNT(*) DESC, val DESC) AS rn
    FROM (
        -- 把A1-A4拆成多行
        SELECT ID, A1 AS val FROM your_table
        UNION ALL
        SELECT ID, A2 AS val FROM your_table
        UNION ALL
        SELECT ID, A3 AS val FROM your_table
        UNION ALL
        SELECT ID, A4 AS val FROM your_table
    ) AS unpivoted
    GROUP BY ID, val
)
SELECT ID, val AS A
FROM ranked_vals
WHERE rn = 1;

说明:

  • UNION ALL用来把每个ID的四个列值拆成单独的行,这一步叫“逆透视(unpivot)”;
  • ROW_NUMBER()给每个ID下的数值按出现次数降序编号,次数相同的话可以通过val DESC(或ASC)指定优先级;
  • 如果想保留所有并列频率最高的数值,把ROW_NUMBER()换成RANK()就行,这样同次数的数值都会被选中。

兼容老版本MySQL(无窗口函数)

如果你的MySQL版本低于8.0,不支持窗口函数,可以用嵌套子查询实现:

SELECT 
    t.ID,
    (SELECT val
     FROM (
         SELECT ID, A1 AS val FROM your_table
         UNION ALL
         SELECT ID, A2 AS val FROM your_table
         UNION ALL
         SELECT ID, A3 AS val FROM your_table
         UNION ALL
         SELECT ID, A4 AS val FROM your_table
     ) AS unpivoted
     WHERE unpivoted.ID = t.ID
     GROUP BY val
     -- 按出现次数降序,次数相同取较大值
     ORDER BY COUNT(*) DESC, val DESC
     LIMIT 1) AS A
FROM your_table t
GROUP BY t.ID;

说明:

外层查询遍历每个ID,子查询针对当前ID统计所有数值的出现次数,排序后取第一条,同样可以调整ORDER BY里的规则处理并列情况。

内容的提问来源于stack exchange,提问作者Rohit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:07:53