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
相关产品推荐
相关产品推荐

