PostgreSQL array_agg 与 string_agg 的排序与去重写法-SQL

array_agg需用括号内ORDER BY保证结果有序,如array_agg(col ORDER BY col);去重须先unnest再distinct最后array_agg;string_agg去重需在子查询中完成,且NULL分隔符会导致整个结果为NULL。

array_agg 怎么保证结果有序

array_agg 默认不保序,即使输入数据已排序,聚合后顺序仍可能错乱。必须显式用 ORDER BY 子句控制内部排序,写法是:array_agg(col ORDER BY col) 或 array_agg(col ORDER BY col DESC)。注意这个 ORDER BY 是写在括号里、紧贴函数名后的,不是外面的 ORDER BY;否则只影响最终查询结果排序,不影响数组元素顺序。

常见错误是写成:SELECT array_agg(col) FROM t ORDER BY col——这只会让整行结果按 col 排,array_agg 里元素仍是随机顺序。

  • 多字段排序也支持:array_agg(name ORDER BY dept, salary DESC)
  • 若排序字段含 NULL,默认排在最前;加 NULLS LAST 可调整:array_agg(x ORDER BY x NULLS LAST)
  • 子查询中嵌套使用时,ORDER BY 仍需放在函数括号内,不能移到外层

string_agg 去重必须先 distinct 再聚合

string_agg 本身不提供去重参数,也不能在函数内部写 DISTINCT(会报错 syntax error at or near "DISTINCT")。正确做法是把去重逻辑上推到输入源:用子查询或 CTE 先 DISTINCT,再喂给 string_agg。

例如想拼接去重后的标签列表:SELECT string_agg(tag, ', ') FROM (SELECT DISTINCT tag FROM tags WHERE post_id = 123) t。如果还要求有序,就在子查询里加 ORDER BY:(SELECT DISTINCT tag FROM tags WHERE post_id = 123 ORDER BY tag)。

  • 别试图用 string_agg(DISTINCT tag, ', ')——语法不合法
  • 用 GROUP BY 配合 DISTINCT 时要注意:若分组键和去重字段不同,DISTINCT 作用范围是整个 SELECT 列表,容易误去重
  • 性能敏感场景下,DISTINCT + string_agg 比用窗口函数或递归 CTE 更轻量,优先选前者

array_agg 去重只能靠 unnest + distinct + array_agg 组合

array_agg 同样不支持内置去重,但比 string_agg 多一层转换成本:得先把数组展开、去重、再聚合成新数组。典型写法:(SELECT ARRAY(SELECT DISTINCT UNNEST(array_agg(col)) ORDER BY 1))。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » PostgreSQL array_agg 与 string_agg 的排序与去重写法-SQL
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4005271+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4005271+
  • 本周更新: 0+
  • 最后更新: 2026-03-16