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

如何在不关闭ONLY_GROUP_BY_ALL模式下筛选不同列组合的行ID?

原始数据表

ida1a2a3
1b30010
2c11112
3b30010
4b30010

符合ONLY_FULL_GROUP_BY模式的替代方案

方案1:用聚合函数取每组任意ID

直接通过MIN()或MAX()聚合函数获取每组的第一个/最后一个ID,完全符合SQL标准,无需修改模式:

-- 取每组最小ID
SELECT MIN(id) AS id
FROM data
GROUP BY a1, a2, a3;

-- 或取每组最大ID
SELECT MAX(id) AS id
FROM data
GROUP BY a1, a2, a3;

两种写法都会返回每组的任意一个ID,满足需求。

方案2:用窗口函数灵活选行

如果需要更自由地指定取组内哪一行(比如随机取),可以用窗口函数标记组内行的顺序,再筛选目标行:

SELECT id
FROM (
    SELECT 
        id,
        -- 按a1/a2/a3分组,给组内每行编号
        ROW_NUMBER() OVER (PARTITION BY a1, a2, a3 ORDER BY id) AS row_num
    FROM data
) t
WHERE row_num = 1;

把ORDER BY id换成ORDER BY RAND()(MySQL)或ORDER BY RANDOM()(PostgreSQL),就能实现随机取组内任意一行。

方案3:PostgreSQL专属简化写法

如果你用的是PostgreSQL,DISTINCT ON语法可以直接获取每组的第一行:

SELECT DISTINCT ON (a1, a2, a3) id
FROM data
ORDER BY a1, a2, a3, id;

这里ORDER BY必须先包含DISTINCT ON的分组列,后面的列用来决定取组内哪一行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 23:15:35