Potrzebuję pomocy z funkcjami okienkowania. Wiem, że możesz obliczyć sumę w oknie i sumę bieżącą w oknie. Ale czy można obliczyć poprzednią sumę bieżącą, tj. Sumę bieżącą bez bieżącego wiersza?
Zakładam, że będziesz musiał użyć argumentu ROW
lub RANGE
. Wiem, że istnieje CURRENT ROW
opcja, ale potrzebowałbym CURRENT ROW - 1
, która jest niepoprawną składnią. Moja wiedza na temat argumentów ROW
i RANGE
jest ograniczona, więc każda pomoc byłaby z wdzięcznością przyjęta.
Wiem, że istnieje wiele rozwiązań tego problemu, ale szukam, aby zrozumieć ROW
, RANGE
argumenty i Zakładam, że problem może być pęknięty z nich. Podałem jeden możliwy sposób obliczenia poprzedniej sumy bieżącej, ale zastanawiam się, czy istnieje lepszy sposób:
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