如何按realm_id聚合PostgreSQL表,根据状态标记active/inactive
解决方案
可以通过聚合函数结合条件判断来实现需求,以下是两种简洁的实现方式:
方法一:使用BOOL_OR聚合函数
SELECT realm_id, CASE WHEN BOOL_OR(status NOT IN ('closed', 'denied')) THEN 'active' ELSE 'inactive' END AS status FROM my_table GROUP BY realm_id;
逻辑说明
BOOL_OR(expr)会返回分组内是否存在至少一条记录满足表达式expr为真- 这里判断分组内是否有状态既不是
closed也不是denied的记录,若存在则标记为active,否则标记为inactive - 最后按
realm_id分组聚合得到结果
方法二:使用COUNT统计符合条件的记录数
SELECT realm_id, CASE WHEN COUNT(CASE WHEN status NOT IN ('closed', 'denied') THEN 1 END) > 0 THEN 'active' ELSE 'inactive' END AS status FROM my_table GROUP BY realm_id;
逻辑说明
- 内层
CASE语句仅对状态非closed/denied的记录返回1,其余返回NULL COUNT()函数会忽略NULL值,统计符合条件的记录数量- 若数量大于0则说明存在目标记录,标记为
active,否则为inactive
内容的提问来源于stack exchange,提问作者Fisher Coder
相关产品推荐
相关产品推荐

