如何使用Array_agg避免返回不同顺序的重复值?
解决Array_Agg生成无序数组导致重复统计的问题
问题根源
你遇到的重复统计是因为array_agg默认不保证聚合元素的顺序,同一组(相同Time和ID)的Fieldname如果原始顺序不同,会生成内容相同但顺序不同的数组,被数据库视为不同的分组键,最终统计出重复记录。
正确解决方案
要让相同内容的数组被视为同一组,核心是在array_agg内部对Fieldname指定排序规则,确保生成的数组顺序一致。如果需要去重同一组内的重复Fieldname,还可以搭配DISTINCT使用:
基础版(仅统一数组顺序)
SELECT b.field, COUNT(*) FROM ( SELECT time, id, array_agg(fieldname ORDER BY fieldname) AS field FROM a GROUP BY time, id ) b GROUP BY b.field ORDER BY COUNT(*) DESC;
去重版(处理同一Time+ID下的重复Fieldname)
SELECT b.field, COUNT(*) FROM ( SELECT time, id, array_agg(DISTINCT fieldname ORDER BY fieldname) AS field FROM a GROUP BY time, id ) b GROUP BY b.field ORDER BY COUNT(*) DESC;
为什么之前的尝试无效
你之前在子查询中先排序再分组的写法逻辑错误:内层子查询的ORDER BY是在GROUP BY执行后生效,无法影响array_agg的聚合顺序。只有在array_agg函数内部直接指定排序规则,才能让聚合过程按固定顺序生成数组。
内容的提问来源于stack exchange,提问作者Mike N Excel
相关产品推荐
相关产品推荐

