如何对值可互换的两列执行GROUP BY分组
两列互换值GROUP BY 统一分组解决方案
核心逻辑是对需要分组的两列做顺序标准化:无论原始两列值顺序如何,都先将排序后更小的值作为第一个分组字段,更大的值作为第二个分组字段,再基于标准化后的字段执行分组即可。
通用兼容写法(支持所有主流SQL数据库)
通过CASE WHEN判断实现字段顺序统一,兼容MySQL、PostgreSQL、Oracle、SQL Server等绝大多数数据库:
SELECT CASE WHEN COL1 < COL2 THEN COL1 ELSE COL2 END AS partner_1, CASE WHEN COL1 < COL2 THEN COL2 ELSE COL1 END AS partner_2, COUNT(COL3) AS total_cooperation_tasks FROM 你的表名 GROUP BY CASE WHEN COL1 < COL2 THEN COL1 ELSE COL2 END, CASE WHEN COL1 < COL2 THEN COL2 ELSE COL1 END
执行上述查询后,示例数据会将User1和User2的4条合作记录归为同一分组,最终返回的total_cooperation_tasks值为4。
简化写法(支持LEAST/GREATEST函数的数据库)
如果使用的是PostgreSQL、MySQL 8.0+、SQL Server 2022+等支持LEAST(取最小值)、GREATEST(取最大值)函数的数据库,可以直接用函数简化代码:
SELECT LEAST(COL1, COL2) AS partner_1, GREATEST(COL1, COL2) AS partner_2, COUNT(COL3) AS total_cooperation_tasks FROM 你的表名 GROUP BY LEAST(COL1, COL2), GREATEST(COL1, COL2)
注意事项
如果两列存在NULL值,需要提前用COALESCE/IFNULL函数对NULL值做默认值填充,避免比较逻辑异常。
内容的提问来源于stack exchange,提问作者Deacon
相关产品推荐
相关产品推荐

