Preciso de ajuda com as funções de janelas. Eu sei que você pode calcular a soma dentro de uma janela e o total em execução dentro de uma janela. Mas é possível calcular o total de corrida anterior, ou seja, o total de corrida que não inclui a linha atual?
Eu suponho que você precisaria usar o ROW
ou RANGE
argumento. Eu sei que existe uma CURRENT ROW
opção, mas eu precisaria CURRENT ROW - 1
, que é uma sintaxe inválida. Meu conhecimento dos argumentos ROW
e RANGE
é limitado, portanto qualquer ajuda seria recebida com gratidão.
Eu sei que existem muitas soluções para este problema, mas eu estou olhando para compreender as ROW
, RANGE
argumentos e presumo que o problema pode ser quebrada com estes. Incluí uma maneira possível de calcular o total anterior, mas me pergunto se existe uma maneira melhor:
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