Snowflake环境下使用SQL按规则对ID关联多行标签分组
Snowflake SQL 实现分组逻辑方案
实现思路
- 按ID维度聚合,通过条件聚合函数标记每个ID是否存在规则判定需要的四类tag:
1、A、2、B - 优先级判断:先匹配冲突规则,冲突直接返回NULL,无冲突再匹配分组规则
可直接运行的SQL代码
WITH id_tag_flag AS ( SELECT ID, -- 标记当前ID是否存在对应tag BOOLOR_AGG(tag = '1') AS has_tag_1, BOOLOR_AGG(tag = 'A') AS has_tag_A, BOOLOR_AGG(tag = '2') AS has_tag_2, BOOLOR_AGG(tag = 'B') AS has_tag_B FROM 替换为你的实际表名 GROUP BY ID ) SELECT ID, CASE -- 优先判定冲突条件 WHEN (has_tag_1 AND has_tag_B) OR (has_tag_2 AND has_tag_A) THEN NULL WHEN has_tag_1 OR has_tag_A THEN 'GROUPA' WHEN has_tag_2 OR has_tag_B THEN 'GROUPB' END AS "GROUP" FROM id_tag_flag ORDER BY ID;
逻辑说明
- 用Snowflake内置的
BOOLOR_AGG聚合函数,只要同一个ID下有任意一行tag符合条件就返回TRUE,相比多次子查询关联性能更优 - 严格按照规则优先级判断,和你给出的期望输出结果完全一致
- 其余不参与判定的tag值不会影响聚合结果,符合需求要求
内容的提问来源于stack exchange,提问作者John Thomas
相关产品推荐
相关产品推荐

