วิ่งรวมไปยังแถวก่อนหน้า


14

ฉันต้องการความช่วยเหลือเกี่ยวกับฟังก์ชั่นหน้าต่าง ฉันรู้ว่าคุณสามารถคำนวณผลรวมภายในหน้าต่างและผลรวมสะสมภายในหน้าต่าง แต่เป็นไปได้หรือไม่ที่จะคำนวณผลรวมการทำงานก่อนหน้าเช่นผลรวมการรันที่ไม่รวมแถวปัจจุบัน

ฉันคิดว่าคุณจะต้องใช้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

คำตอบ:


22

คำตอบคือจะใช้ไม่ได้1 PRECEDING CURRENT ROW -1ดังนั้นในการค้นหาของคุณให้ใช้:

    , SUM(s.OrderQty) OVER (PARTITION BY  SalesOrderID 
                            ORDER BY SalesOrderDetailID
                            ROWS BETWEEN UNBOUNDED PRECEDING 
                                     AND 1 PRECEDING) 
    AS  PreviousRunningTotal

โปรดทราบว่าในการคำนวณอื่น ๆ ของคุณ:

    , SUM(s.OrderQty) OVER (PARTITION BY  SalesOrderID
                            ORDER BY SalesOrderDetailID) ...

แบบ SQL Server ใช้เริ่มต้น* RANGE UNBOUNDED PRECEDING AND CURRENT ROWฉันคิดว่ามีความแตกต่างอย่างมีประสิทธิภาพและROWS UNBOUNDED PRECEDING AND CURRENT ROWเป็นที่ต้องการ (หลังจากการทดสอบแน่นอนและหากให้ผลลัพธ์ที่คุณต้องการ)

รายละเอียดเพิ่มเติมที่คุณสามารถหาได้ในบทความบล็อกโดย@Aaron Bertrandรวมถึงการทดสอบประสิทธิภาพ: แนวทางที่ดีที่สุดสำหรับการเรียกใช้ผลรวม - อัปเดตสำหรับ SQL Server 2012

* นี่เป็นช่วงเริ่มต้นที่แน่นอนเมื่อมีORDER BYอยู่ภายในส่วนOVERคำสั่ง - มิฉะนั้นโดยไม่มีORDER BYค่าเริ่มต้นคือพาร์ติชันทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.