Snowflake中移除重复值并保留最后session_group数据的问题
解决方案:移除重复值并保留每个anonymous_id的最后一个session_group
核心需求回顾
按anonymous_id分组,仅保留每个组中session_group值最大的完整记录,且禁止使用窗口函数(partition by)。
问题分析
- 第一个查询的问题:
GROUP BY中包含了order_number、session_group_b2、CHAN_ATTRIBUTION,导致分组粒度太细,同一anonymous_id下只要这些字段不同就会生成多条结果,所以仍有重复。 - 第二个查询的问题:
PARTITION BY错误地使用了order_number,逻辑不符合需求,且违反了禁止使用partition by的要求。
可行方案(无需窗口函数)
方案1:关联子查询
通过子查询先获取每个anonymous_id对应的最大session_group,再匹配原表的完整记录:
SELECT cto.* FROM channel_to_order cto WHERE (cto.anonymous_id, cto.session_group) IN ( SELECT anonymous_id, MAX(session_group) FROM channel_to_order GROUP BY anonymous_id );
方案2:JOIN关联分组结果
先分组计算每个anonymous_id的最大session_group,再通过JOIN关联原表拿到完整数据:
SELECT cto.* FROM channel_to_order cto JOIN ( SELECT anonymous_id, MAX(session_group) AS last_session FROM channel_to_order GROUP BY anonymous_id ) AS max_sessions ON cto.anonymous_id = max_sessions.anonymous_id AND cto.session_group = max_sessions.last_session;
额外处理:同一匿名用户+最大session_group下有多条记录的情况
如果存在同一个anonymous_id和最大session_group对应多条记录(比如同一用户同一session_group下有多个订单),可以进一步保留最新的order_number:
SELECT cto.* FROM channel_to_order cto WHERE (cto.anonymous_id, cto.session_group, cto.order_number) IN ( SELECT anonymous_id, MAX(session_group), MAX(order_number) FROM channel_to_order GROUP BY anonymous_id );
内容的提问来源于stack exchange,提问作者steph
相关产品推荐
相关产品推荐

