Preciso de ajuda com funções de janelas. Eu sei que você pode calcular a soma dentro de uma janela e o total corrente dentro de uma janela. Mas é possível calcular o total em execução anterior, ou seja, o total em execução não incluindo a linha atual?
Eu suponho que você precisaria usar o argumento ROW
ou . RANGE
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 estou procurando entender os argumentos ROW
e RANGE
suponho que o problema pode ser resolvido com eles. Eu incluí uma maneira possível de calcular o total anterior, mas gostaria de saber 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
A resposta é usar
1 PRECEDING
, nãoCURRENT ROW -1
. Então, na sua consulta, use:Observe também que em seu outro cálculo:
SQL-Server usa o padrão *
RANGE UNBOUNDED PRECEDING AND CURRENT ROW
. Eu acho que há uma diferença de eficiência eROWS UNBOUNDED PRECEDING AND CURRENT ROW
deve ser o preferido (após o teste é claro e se der os resultados desejados).Muito mais detalhes você pode encontrar no artigo do blog de @Aaron Bertrand , incluindo testes de desempenho: Melhores abordagens para executar totais – atualizado para SQL Server 2012
* este é, obviamente, o intervalo padrão quando um
ORDER BY
está presente dentro daOVER
cláusula - caso contrário, semORDER BY
o padrão é toda a partição.