पिछली पंक्ति में कुल चल रहा है


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- सर्वर डिफ़ॉल्ट * का उपयोग करता है RANGE UNBOUNDED PRECEDING AND CURRENT ROW। मुझे लगता है कि एक दक्षता अंतर है और ROWS UNBOUNDED PRECEDING AND CURRENT ROWपसंद किया जाना है (पाठ्यक्रम के परीक्षण के बाद और अगर यह आपके इच्छित परिणाम देता है)।

बहुत अधिक विवरण आप @Aaron बर्ट्रेंड के ब्लॉग लेख में पा सकते हैं , जिसमें प्रदर्शन परीक्षण शामिल हैं: रनिंग योग के लिए सर्वश्रेष्ठ दृष्टिकोण - SQL सर्वर 2012 के लिए अपडेट किया गया

* यह निश्चित रूप से डिफ़ॉल्ट सीमा है जब कोई खंड के ORDER BYअंदर मौजूद होता है OVER- अन्यथा, ORDER BYडिफ़ॉल्ट के बिना पूरा विभाजन होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.