Мне нужна помощь с оконными функциями. Я знаю, что вы можете рассчитать сумму в окне и промежуточную сумму в окне. Но возможно ли рассчитать предыдущий промежуточный итог, т.е. промежуточный итог, не включая текущую строку?
Я предполагаю, что вам нужно будет использовать аргумент ROW
или RANGE
. Я знаю, что есть CURRENT ROW
опция, но мне нужно CURRENT ROW - 1
, это неверный синтаксис. Мои знания аргументов ROW
and RANGE
ограничены, поэтому любая помощь будет принята с благодарностью.
Я знаю, что есть много решений этой проблемы, но я хочу понять ROW
, RANGE
аргументы, и я предполагаю, что проблема может быть решена с их помощью. Я включил один из возможных способов расчета предыдущей промежуточной суммы, но мне интересно, есть ли лучший способ:
USE AdventureWorks2012
SELECT s.SalesOrderID
, s.SalesOrderDetailID
, s.OrderQty
, SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID) AS RunningTotal
, SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID
ORDER BY SalesOrderDetailID) - s.OrderQty AS PreviousRunningTotal
-- Sudo code - I know this does not work
--, SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID
-- ORDER BY SalesOrderDetailID
-- ROWS BETWEEN UNBOUNDED PRECEDING
-- AND CURRENT ROW - 1)
-- AS SudoCodePreviousRunningTotal
FROM Sales.SalesOrderDetail s
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)
ORDER BY s.SalesOrderID
, s.SalesOrderDetailID
, s.OrderQty