You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 00:10:47