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

Redshift SQL调试求助:首单高于次单用户平均终身消费查询结果差异

问题核心原因分析

  • 核心错误:误拆分同一物理订单为多个逻辑订单

    你的cte2_order的分组逻辑是group by oi.user_id, oi.order_id, oi.created_at,本质是按订单项的创建时间拆分了同一个订单:如果一个订单的多个订单项created_at不一致,同一个order_id会被拆为多行,每行只统计对应created_at下的订单项金额总和,而非整个订单的实付总金额。
    举个典型例子:用户只有1个订单,含2个订单项,订单项1创建时间t1金额60,订单项2创建时间t2金额40。你的逻辑会把这个订单拆为2条记录,误判为用户有2单:首单60、第二单40,满足「首单高于第二单」被纳入统计。但该用户实际只有1单,根本不符合统计条件,且这类用户的终身消费普遍偏低,直接拉低了你的平均值。
    而官方写法用SUM(sale_price) OVER (PARTITION BY order_id)计算订单总金额,同一个order_id的所有行的订单总金额一致,哪怕订单项创建时间不同,对比的也是完整的订单金额,上述例子里两个逻辑行的订单金额都是100,100>100不成立,会正确排除该用户。
  • 次要影响:并列订单的统计逻辑偏差

    你和官方都用了RANK()做订单排序,如果同一个用户同一时间创建了2个订单,两个订单的排序都会是1,下一个订单排序为3,你们的逻辑都会找不到排序为2的订单,直接排除这类用户。如果需求中「首单」指最早时间的所有订单总金额,那这部分用户也会被漏统计,但这个对结果的影响远小于第一个问题。

修复建议

修改你的cte2_order逻辑,先按order_id聚合得到完整订单信息,再做排序:

cte2_order as (
    select 
        oi.user_id, 
        oi.order_id, 
        sum(oi.sale_price) as order_total, 
        -- 取订单的最小创建时间作为订单时间,避免同一订单多订单项时间差异问题
        min(oi.created_at) as order_created_at,
        rank() over(partition by oi.user_id order by min(oi.created_at)) as order_rank
    from order_items as oi
    group by oi.user_id, oi.order_id -- 移除created_at分组,保证一个订单只对应一行
)

内容的提问来源于stack exchange,提问作者Catherine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:45:02