You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中如何将array_agg的条件聚合结果合并为同一行

PostgreSQL 按异常类型拆分列实现行转列方案

错误原因

你当前查询返回多行、单列为空的核心原因是GROUP BY子句包含了exception_type字段,数据库会按照service_id + exception_type的组合维度分组,同个service_id下不同异常类型的数据会被拆分为独立行,因此每行仅能匹配到一类异常类型的日期,另一列自然返回空值。

正确实现代码

将条件判断逻辑放到聚合函数内部,GROUP BY仅保留service_id字段即可实现每个服务ID仅返回一行的需求:

SELECT 
  service_id,
  array_to_string(
    array_agg(CASE WHEN exception_type = '1' THEN date END), 
    ', '
  ) as available,
  array_to_string(
    array_agg(CASE WHEN exception_type = '2' THEN date END), 
    ', '
  ) as unavailable
FROM calendardates
GROUP BY service_id;

补充说明

聚合函数array_agg会自动忽略CASE表达式返回的NULL值,只会拼接符合对应异常类型的日期值。如果需要处理某类异常类型无数据的场景,避免返回NULL,可以在外层包裹COALESCE函数指定默认空值,示例:

COALESCE(array_to_string(array_agg(CASE WHEN exception_type = '1' THEN date END), ', '), '') as available

内容的提问来源于stack exchange,提问作者Radek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:06:04