如何在SQL中对数组列的所有排列对应值分组求和?
解决SQL中数组/字符串排列分组求和问题
问题核心
需要将数组类型(或逗号分隔字符串)列的所有元素排列视为同一分组,对每组的value字段求和,且元素数量不固定(2个、3个或更多元素的排列都需归为同一组),硬编码枚举排列的方式无法覆盖所有场景。
现有方案的不足
你当前使用CASE语句硬编码匹配特定排列的方式,仅能处理预设的几组组合,一旦新增元素组合或元素数量变化,就需要修改代码,扩展性极差,无法应对动态场景。
通用解决方案
核心思路:将数组/字符串的元素排序后生成固定顺序的标识,以此作为分组键——所有排列经过排序后都会得到完全相同的标识,自然被归为同一组。
场景1:列是原生数组类型(如PostgreSQL、BigQuery等支持数组的数据库)
以PostgreSQL为例:
SELECT array_to_string(array_sort(table_list), ',') AS tables_group, SUM(value) AS total_value FROM my_table GROUP BY tables_group;
场景2:列是逗号分隔的字符串(如示例中的a,b,c格式)
以PostgreSQL为例:
SELECT array_to_string(array_sort(string_to_array(table_column, ',')), ',') AS tables_group, SUM(value) AS total_value FROM my_table GROUP BY tables_group;
场景3:BigQuery语法适配
SELECT ARRAY_TO_STRING(ARRAY(SELECT val FROM UNNEST(SPLIT(table_column, ',')) val ORDER BY val), ',') AS tables_group, SUM(value) AS total_value FROM my_table GROUP BY tables_group;
效果验证
针对你的示例数据,所有a,b,c的排列排序后都会生成a,b,c作为分组键,求和结果为10+21+12+13+16+12=84;所有d,e,f的排列排序后生成d,e,f,求和结果为15+12+13+16+11+20=87,完全符合期望输出。
这种方案无需硬编码任何组合,无论元素数量多少,都能自动完成分组求和,具备极强的扩展性。
内容的提问来源于stack exchange,提问作者Zole72
相关产品推荐
相关产品推荐

