【发布时间】:2016-01-21 20:39:13
【问题描述】:
注意:我使用的是 SQL Server 2008 R2,内置的 LEAD/LAG 函数不可用。
我需要更新表的列以包含 ProductID 的“上一个”和“下一个”值 - 该表需要存储 PrevProductID (LAG)、ProductID 和 NextProductID (LEAD)。下面的代码很好地做到了这一点,并改编自 Geri Reshef 对http://blog.sqlauthority.com/2011/11/24/sql-server-solution-to-puzzle-simulate-lead-and-lag-without-using-sql-server-2012-analytic-function/的回答
USE AdventureWorks2008R2
GO
WITH T1 AS
( SELECT Row_Number() OVER(ORDER BY SalesOrderID,ProductID) N,
s.SalesOrderID,
s.ProductID
FROM Sales.SalesOrderDetail s
WHERE SalesOrderID IN (43670, 43667, 43663)
)
SELECT SalesOrderID,
CASE WHEN N%2=1
THEN MAX(CASE WHEN N%2=0
THEN ProductID
END) OVER (Partition BY N/2)
ELSE MAX(CASE WHEN N%2=1
THEN ProductID
END) OVER (Partition BY (N+1)/2)
END PrevProductID,
ProductID,
CASE WHEN N%2=1
THEN MAX(CASE WHEN N%2=0
THEN ProductID
END) OVER (Partition BY (N+1)/2)
ELSE MAX(CASE
WHEN N%2=1 THEN ProductID
END) OVER (Partition BY N/2)
END NextProductID
FROM T1
ORDER BY
t1.SalesOrderID,
t1.ProductID
这些是结果,滞后/领先应用于所有行。
SalesOrderID PrevProductID ProductID NextProductID
------------ ------------- ----------- -------------
43663 NULL 760 710
43667 760 710 773
43667 710 773 775
43667 773 775 778
43667 775 778 709
43670 778 709 710
43670 709 710 773
43670 710 773 776
43670 773 776 NULL
我需要做的是按 SalesOrderID 对 Lag/Lead 值进行分组,第一次出现指向 NULL 的 Lag,最后一次出现指向 SalesOrderID 组中的 Lead NULL。
SalesOrderID PrevProductID ProductID NextProductID
------------ ------------- ----------- -------------
43663 NULL 760 NULL
43667 NULL 710 773
43667 710 773 775
43667 773 775 778
43667 775 778 NULL
43670 NULL 709 710
43670 709 710 773
43670 710 773 776
43670 773 776 NULL
【问题讨论】:
标签: sql-server sql-server-2008-r2 lag lead