分组聚合时根据特定值添加label列的SQL实现问题
解决分组内存在特定值的标签判断问题
你当前的SQL会得到两个结果,是因为把基于单行name生成的label字段加入了GROUP BY子句。这会让数据库把name='tomato'的行和其他行分成两个独立分组,自然输出两行结果。
以下是两种正确的实现方式:
方法一:使用bool_or聚合函数(PostgreSQL适用)
bool_or会检查分组内是否存在任意一行满足指定条件,返回布尔值,非常适合这种"存在即判断"的场景:
select product_group_id, group_name, class, case when bool_or(name = 'tomato') then 'invalid' else 'valid' end as label from rule group by product_group_id, group_name, class;
方法二:使用count聚合函数(通用SQL写法)
如果你的数据库不支持bool_or,可以用count统计符合条件的行数,判断是否大于0:
select product_group_id, group_name, class, case when count(case when name = 'tomato' then 1 end) > 0 then 'invalid' else 'valid' end as label from rule group by product_group_id, group_name, class;
原理说明
两种写法都是先按product_group_id、group_name、class完成分组,再对整个分组的name字段进行聚合判断,确保每个分组只输出一行结果,符合你预期的单一行记录要求。
内容的提问来源于stack exchange,提问作者Maxim
相关产品推荐
相关产品推荐

