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

शिफ्ट: LAG और लीड

शिफ्ट: LAG और लीड

अनुक्रमिक और समय-आधारित डेटा में, आपको अक्सर वर्तमान पंक्ति की पिछले दिन की पंक्ति से तुलना करने की आवश्यकता होती है। "मानक" SQL में, ऐसा करने के लिए बहुत खतरनाक (और बहुत धीमी) सेल्फ-जॉइन की आवश्यकता होती है।

LAG() (पिछली पंक्ति) और LEAD() (अगली पंक्ति) फ़ंक्शन अत्यधिक चपलता और सुंदरता के साथ इस समस्या को हल करते हैं।

अतीत और भविष्य की ओर देखना

SQL
SELECT
  created_at,
  total_amount,
  LAG(total_amount) OVER(ORDER BY created_at) AS importo_ordine_precedente
FROM orders;

उदाहरण में, प्रत्येक पंक्ति एक ही तालिका द्वारा उत्पादित राशि को आसानी से ले जाएगी, एक पंक्ति द्वारा आगे स्थानांतरित कर दी जाएगी (समय में पीछे की ओर)। हम अंतर या महीने-दर-महीने प्रतिशत परिवर्तन की गणना करने के लिए total_amount - LAG(...) को आसानी से घटा सकते हैं!

इसी तरह, LEAD() मौजूदा पंक्ति के ठीक नीचे वाली पंक्ति से मान खींच लेगा।

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

'उत्पाद' तालिका से, 'id', 'launched_on', 'price' निकालें और 'prev_price' जोड़ें, यानी उत्पाद की 'कीमत' को तार्किक रूप से 'पिछला' माना जाता है, आरोही 'launched_on' क्रम में।

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

LAG(मूल्य) का उपयोग करें (ASC पर लॉन्च किए गए ऑर्डर के अनुसार)

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

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

आप प्रति व्यक्तिगत उपयोगकर्ता रेटिंग में उछाल की गणना कैसे करेंगे? इसका अनुकरण करें: 'समीक्षा' तालिका से 'ग्राहक_आईडी', 'निर्मित_एट', 'रेटिंग' और 'नेक्स्ट_रेटिंग' (समय के साथ उसी ग्राहक की अगली समीक्षा) निकालें। इसलिए 'customer_id' के आधार पर विभाजन करें, 'created_at' के आधार पर ऑर्डर करें और आगे देखने के लिए सही विंडो फ़ंक्शन का उपयोग करें।

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

ओवर में PARTITION BY और ORDER BY के साथ LEAD()।

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