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

AdventureWorks2019使用LAG取前序订单日期返回NULL问题求助

问题原因

  • 你的CTE A 虽计算了每个客户的最新订单日期,但关联salesorderheader时仅匹配了客户ID,未关联订单日期,导致结果集包含了客户的所有历史订单,而非仅最新订单的行
  • 未对结果按窗口函数行号做筛选,每个客户的第一笔历史订单的LAG结果天然为NULL,若客户仅产生过1笔订单,LAG返回NULL属于正常逻辑
  • 原代码中按订单日期升序生成行号,最新订单对应的行号是每个客户分组内的最大值,你未做筛选保留该行,导致看到的NULL多为最早订单的计算结果

修正实现

WITH A AS
(
    SELECT customerid, MAX(orderdate) AS Maxdate 
    FROM Sales.salesorderheader 
    GROUP BY CustomerID
)
SELECT 
    Salesorderid,
    CustomerID,
    Lastname,
    Firstname,
    [Last Order],
    [Previous Order]
FROM 
(
    SELECT 
        S.Salesorderid,
        S.CustomerID,
        P.Lastname,
        P.Firstname,
        S.OrderDate AS 'Last Order',
        LAG(s.OrderDate) OVER(PARTITION BY S.customerID ORDER BY S.orderdate) AS 'Previous Order',
        ROW_NUMBER() OVER(PARTITION BY S.customerID ORDER BY S.Orderdate DESC) AS RS
    FROM Sales.salesorderheader S 
    JOIN A AS AA
        ON AA.customerid = S.customerid AND AA.Maxdate = S.OrderDate
    JOIN Sales.Customer C 
        ON C.CustomerID = S.CustomerID  
    JOIN Person.Person P 
        ON P.businessentityID = C.PersonID
) s
WHERE RS = 1

补充说明

如果修正后仍有部分Previous Order返回NULL,对应客户仅存在1笔有效订单,无历史前序订单,属于正常结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 11:12:01