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
相关产品推荐
相关产品推荐

