ฉันต้องการความช่วยเหลือเกี่ยวกับฟังก์ชั่นหน้าต่าง ฉันรู้ว่าคุณสามารถคำนวณผลรวมภายในหน้าต่างและผลรวมสะสมภายในหน้าต่าง แต่เป็นไปได้หรือไม่ที่จะคำนวณผลรวมการทำงานก่อนหน้าเช่นผลรวมการรันที่ไม่รวมแถวปัจจุบัน
ฉันคิดว่าคุณจะต้องใช้ROW
หรือRANGE
โต้แย้ง ฉันรู้ว่ามีCURRENT ROW
ตัวเลือก แต่ฉันต้องการCURRENT ROW - 1
ซึ่งเป็นไวยากรณ์ที่ไม่ถูกต้อง ความรู้ROW
และ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