Rol*_*aer 2 sql t-sql sql-server
我有一种情况需要使用select语句在一行中选择当前和之前的订单金额.
订单表:
Customer Id
OrderId
OrderDate
OrderAmount
Run Code Online (Sandbox Code Playgroud)
当前选择声明:
SELECT o.OrderId, o.OrderDate, o.OrderAmount, po.OrderAmount
FROM Order o
LEFT JOIN (
SELECT TOP(1) so.OrderAmount
FROM Order so
WHERE so.CustomerId = o.CustomerId and so.OrderId <> o.OrderId
ORDER BY so.OrderDate DESC
) po
Run Code Online (Sandbox Code Playgroud)
问题是不允许子查询中的"where"子句.是否有另一种获取此信息的方法.
这实际上是对更复杂的选择(对于视图)的简化,其需要用于当前和上一报告期的财务报告的数据.
你需要OUTER APPLY在这里.
你的WHERE条款看起来不正确.我假设OrderDate在下面能够确定"前一行"是唯一的.
SELECT o.OrderId,
o.OrderDate,
o.OrderAmount,
po.OrderAmount
FROM [Order] o
OUTER APPLY(SELECT TOP(1) so.OrderAmount
FROM [Order] so
WHERE so.CustomerId = o.CustomerId
AND so.OrderDate < o.OrderDate
ORDER BY so.OrderDate DESC) po
Run Code Online (Sandbox Code Playgroud)
但是你可能会更好地离开加入 ROW_NUMBER
;WITH Ord
AS (SELECT OrderId,
OrderDate,
OrderAmount,
CustomerId,
ROW_NUMBER() OVER ( PARTITION BY CustomerId
ORDER BY OrderDate) AS RN
FROM [Order])
SELECT o.OrderId,
o.OrderDate,
o.OrderAmount,
po.OrderAmount
FROM Ord o
LEFT JOIN Ord po
ON o.CustomerId = po.CustomerId
AND o.RN = po.RN + 1
Run Code Online (Sandbox Code Playgroud)