मुख्य सामग्री पर जाएं
मॉड्यूल 7 · पाठ 3 का 4पाठ्यक्रम में 27/57~12 min
मॉड्यूल पाठ (3/4)

LAG, लीड और रनिंग योग

LAG और LEAD दो विशेष विंडो फ़ंक्शन हैं जो आपको एक्सेस प्रदान करते हैं समान विभाजन की अन्य पंक्तियाँ: पिछली पंक्ति (LAG) या विंडो के ORDER BY के अनुसार अगला (LEAD)। वे हैं पंक्ति-से-पंक्ति तुलना के लिए गो-टू टूल (डेल्टा, विविधताएं, अंतराल) और - रनिंग टोटल के लिए SUM/AVG/COUNT OVER के साथ संयुक्त।

LAG: पिछली पंक्ति

SQL
LAG(colonna)            OVER (PARTITION BY p ORDER BY o)
LAG(colonna, n)         OVER (PARTITION BY p ORDER BY o)   -- n righe indietro
LAG(colonna, n, default) OVER (PARTITION BY p ORDER BY o)  -- default se non c'è

उदाहरण: प्रत्येक आदेश के लिए, "पिछले आदेश के बाद से दिन समान हैं ग्राहक":

SQL
SELECT id,
       customer_id,
       ordered_at,
       ordered_at - LAG(ordered_at) OVER (
         PARTITION BY customer_id ORDER BY ordered_at
       ) AS since_previous_order
FROM   orders
ORDER BY customer_id, ordered_at;

प्रत्येक ग्राहक के पहले ऑर्डर में since_previous_order = NULL होता है क्योंकि विभाजन में कोई "पिछला" नहीं है.

लीड: अगली पंक्ति

LAG का दर्पण. विशिष्ट: "अगली घटना तक का समय", "अंतर अगले संस्करण के साथ"।

SQL
SELECT id, ordered_at,
       LEAD(ordered_at) OVER (PARTITION BY customer_id ORDER BY ordered_at)
         - ordered_at AS to_next
FROM   orders;

रनिंग टोटल: OVER के साथ समुच्चय

समग्र कार्य (SUM, AVG, COUNT, MAX, MIN) बन जाते हैं संचयी जब OVER (… ORDER BY …) के साथ संयुक्त होता है:

SQL
SELECT order_id,
       total,
       SUM(total) OVER (
         PARTITION BY customer_id
         ORDER BY     ordered_at
       ) AS running_total
FROM   …;

प्रत्येक पंक्ति के लिए, SUM विभाजन में सभी पंक्तियों के योग की गणना करता है वह बिंदु, विंडो के ORDER BY के अनुसार। नतीजा यह है क्लासिक "रनिंग बैलेंस"।

इसे अजमाएं

व्यायाम#sql.m7.l3.e1
प्रयास: 0लोड हो रहा है...

प्रत्येक ऑर्डर के लिए आईडी, ग्राहक_आईडी, ऑर्डर_एट और एक दिन_फ्रॉम_पिछला कॉलम दिखाएं, जो ऑर्डर_एट द्वारा ऑर्डर किए गए वर्तमान ऑर्डर और उसी ग्राहक के पिछले ऑर्डर के बीच पूरे दिनों की संख्या (फ्लोर के साथ) है। यदि कोई पिछला ऑर्डर नहीं है तो शून्य। ग्राहक_आईडी द्वारा ऑर्डर करें और ऑर्डर_पर करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

LAG(ordered_at) OVER (PARTITION BY customer_id ORDER BY order_at) ग्राहक के पिछले ऑर्डर का टाइमस्टैम्प लौटाता है। अंतराल प्राप्त करने के लिए घटाएँ, फिर दिनों में बदलें।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम की समीक्षा करें

व्यायाम#sql.m7.l3.e2
प्रयास: 0लोड हो रहा है...

प्रत्येक डिलीवर किए गए ऑर्डर के लिए (स्थिति = 'डिलीवर किया गया'), आईडी, ग्राहक_आईडी, ऑर्डर_एट, ऑर्डर_टोटल (मात्रा का योग * इसकी लाइन आइटम की इकाई_कीमत) और रनिंग_टोटल (ऑर्डर किए गए_एट द्वारा ऑर्डर किए गए प्रति ग्राहक कुल का रनिंग टोटल) दिखाएं। ऑर्डर_टोटल के लिए CTE का उपयोग करें। ग्राहक_आईडी द्वारा ऑर्डर करें और ऑर्डर_पर करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

सीटीई प्रति ऑर्डर कुल की गणना करता है; SUM OVER समय के साथ प्रति ग्राहक रनिंग टोटल उत्पन्न करता है।

3 प्रयासों के बाद समाधान उपलब्ध है