PostgreSQL分组查询:存在Failed则返回Failed否则返回Success
PostgreSQL分组状态聚合查询实现
核心实现逻辑
按Col1、Col2、Date三个维度分组,只要分组内存在任意一条Status为Failed的记录,分组最终状态即为Failed;仅当分组内所有记录状态均为Success时,最终状态才返回Success。
推荐SQL语句
使用PostgreSQL内置的bool_or聚合函数实现,执行效率更高:
SELECT Col1, Col2, "Date", CASE WHEN bool_or(Status = 'Failed') THEN 'Failed' ELSE 'Success' END AS Status FROM 你的实际业务表名 -- 替换为环境中真实的业务表名即可 GROUP BY Col1, Col2, "Date" ORDER BY "Date" DESC;
注意事项
Date属于SQL保留关键字,查询时必须用双引号包裹该字段名,否则会触发语法错误- 上述语句执行结果和给出的期望输出完全匹配:
- (1234,123,6/29)分组存在Failed记录,返回Failed
- (1204,133,6/28)分组全为Success,返回Success
- (1224,133,6/28)分组存在Failed记录,返回Failed
- (1214,143,6/27)分组全为Success,返回Success
通用兼容写法
如果需要兼容不支持bool_or聚合的场景,可以用条件计数的方式实现相同效果:
SELECT Col1, Col2, "Date", CASE WHEN SUM(CASE WHEN Status = 'Failed' THEN 1 ELSE 0 END) > 0 THEN 'Failed' ELSE 'Success' END AS Status FROM 你的实际业务表名 GROUP BY Col1, Col2, "Date" ORDER BY "Date" DESC;
内容的提问来源于stack exchange,提问作者una
相关产品推荐
相关产品推荐

