Snowflake SQL合并行:去用户名,保留YES值实现单用户单行
Snowflake SQL 处理用户产品使用记录去重合并
核心思路
同一用户的多条记录里,只要某产品有过YES标记就保留YES,只有全是NO才留NO,同时按用户唯一标识聚合,实现一行对应一个用户。直接用GROUP BY搭配聚合函数就能搞定,不用PARTITION BY那种行级筛选的方式。
实现代码
假设你的源表叫user_product_usage,结构包含user_id(用户唯一标识)、username(重复的用户名)、各产品列(比如product_a、product_b,值为YES/NO):
CREATE OR REPLACE TABLE user_product_summary AS SELECT user_id, -- 对每个产品列取最大值,YES的优先级高于NO MAX(product_a) AS product_a, MAX(product_b) AS product_b, MAX(product_c) AS product_c -- 有更多产品列就继续按这个格式添加 FROM user_product_usage -- 若要筛选特定产品,在这里加WHERE条件,比如 WHERE product_a = 'YES' GROUP BY user_id;
原理说明
字符串排序逻辑里,YES的ASCII码比NO大,MAX()函数会自动保留该用户下对应产品的最高优先级值——只要有一行是YES,聚合结果就是YES;只有所有行都是NO时,结果才是NO。
之前用PARTITION BY没成功,是因为ROW_NUMBER()这类窗口函数只能选取某一行,没法把多行的YES/NO合并判断,而聚合函数刚好能解决这个跨行取值的问题。
内容的提问来源于stack exchange,提问作者Martin McVey
相关产品推荐
相关产品推荐

