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

T-SQL使用聚合函数计算客户订单均值 不足3笔返回NULL时缺失行如何解决

T-SQL语句调整方案

你原来的写法存在三处核心问题:

  • 排序方向错误:按OrderID升序排列后行号最小的是最早的订单,要取最新的3笔需要改为降序排列
  • 过滤逻辑写反:Row_num>3的条件会过滤掉最新的3条记录,保留的是更早的记录,应该改为Row_num<=3
  • 缺少全量客户维度:直接从过滤后的订单数据分组,会丢失订单数不足3的客户记录

调整后的正确语句如下:

SELECT 
    c.CustomerID,
    CASE WHEN COUNT(s.TotalAmount) = 3 THEN AVG(s.TotalAmount) ELSE NULL END AS AverageofLast3_operation
FROM 
    -- 先拿到所有客户的唯一列表,保证所有客户都会出现在结果中
    (SELECT DISTINCT CustomerID FROM CustomerOperation) c
LEFT JOIN 
    (
        SELECT 
            CustomerID, 
            TotalAmount,
            -- 按客户分组,订单ID降序排列,最新的订单行号为1
            ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY OrderID DESC) AS Row_num
        FROM CustomerOperation
    ) s 
    ON c.CustomerID = s.CustomerID 
    AND s.Row_num <= 3 -- 仅关联每个客户最新的3笔订单
GROUP BY c.CustomerID

逻辑说明:

  1. 先通过子查询拿到所有客户的唯一ID列表,作为主表保证所有客户都出现在结果里
  2. 关联的子查询对每个客户的订单按OrderID降序编号,筛选出行号<=3的最新3笔订单
  3. 用CASE判断当前客户关联到的有效订单数是否刚好为3,是则计算平均值,否则返回NULL,完全符合需求要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:15:00