如何在不关闭ONLY_GROUP_BY_ALL模式下筛选不同列组合的行ID?
原始数据表
| id | a1 | a2 | a3 |
|---|---|---|---|
| 1 | b | 300 | 10 |
| 2 | c | 111 | 12 |
| 3 | b | 300 | 10 |
| 4 | b | 300 | 10 |
符合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
相关产品推荐
相关产品推荐

