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

विंडो फ़ंक्शंस: रैंकिंग और प्रति-समूह गणना

विंडो फ़ंक्शन एक फ़ंक्शन है जो "पंक्तियों के समूह" पर काम करता है (विंडो) लेकिन - GROUP BY के विपरीत - की संख्या कम नहीं होती है पंक्तियाँ: विंडो पर गणना किया गया मान प्रत्येक पंक्ति से जुड़ा होता है अंतिम परिणाम.

यह रैंकिंग, प्रगतिशील क्रमांकन, प्रतिशत के लिए सही उपकरण है एक समूह के कुल योग पर, और कई अन्य ऑपरेशन जो अजीब हैं या GROUP BY के साथ असंभव।

सिंटैक्स: function() OVER (…)

SQL
ROW_NUMBER() OVER (PARTITION BY colonna ORDER BY colonna2)

अवयव:

  • PARTITION BY - "समूहों" को परिभाषित करता है (जैसे GROUP BY, लेकिन पंक्तियाँ अलग रहो);
  • ORDER BY अंदर OVER(…) - आदेश को परिभाषित करता है भीतर विभाजन.

OVER () (खाली कोष्ठक) का अर्थ है "एकल विंडो के रूप में संपूर्ण तालिका"। "कुल का प्रतिशत" जैसी गणनाओं के लिए उपयोगी।

रैंकिंग कार्य

SQL
ROW_NUMBER() OVER (PARTITION BY p ORDER BY o)
RANK()       OVER (PARTITION BY p ORDER BY o)
DENSE_RANK() OVER (PARTITION BY p ORDER BY o)

अंतर (मूल्यों के साथ 100, 100, 90, 80):

कार्यपद
ROW_NUMBER1, 2, 3, 4 (हमेशा अद्वितीय)
RANK1, 1, 3, 4 (संबंध एक स्थिति साझा करते हैं, "अंतराल" छोड़ते हैं)
DENSE_RANK1, 1, 2, 3 (संबंध एक स्थिति साझा करते हैं, बिना अंतराल के)

उदाहरण: प्रति श्रेणी उत्पाद रैंकिंग

SQL
SELECT name,
       category_id,
       price,
       RANK() OVER (PARTITION BY category_id ORDER BY price DESC) AS rank
FROM   products
ORDER BY category_id, rank;

प्रत्येक category_id के लिए RANK 1 से पुनः आरंभ होता है और अवरोही क्रम में ऑर्डर करता है कीमत: आपको प्रत्येक श्रेणी के अंदर उत्पादों की रैंकिंग एक में मिलती है गोली मार दी.

प्रगतिशील क्रमांकन

SQL
-- Progressive order number for each customer:
SELECT id,
       customer_id,
       ordered_at,
       ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY ordered_at) AS row_num
FROM   orders
ORDER BY customer_id, row_num;

प्रत्येक ग्राहक के पहले ऑर्डर में row_num = 1, दूसरे में 2 आदि होंगे।

इसे अजमाएं

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

प्रत्येक उत्पाद के लिए नाम, श्रेणी_आईडी, मूल्य और रैंक दिखाएं (श्रेणी के भीतर घटते मूल्य के आधार पर रैंकिंग; रैंक का उपयोग करें)। आरोही श्रेणी_आईडी और आरोही रैंक के आधार पर क्रम लगाएं।

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

श्रेणी_आईडी समूहों द्वारा विभाजन, समूह के भीतर मूल्य डीईएससी आदेशों के अनुसार आदेश।

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

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

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

प्रत्येक ऑर्डर के लिए आईडी, ग्राहक_आईडी, ऑर्डर_एट और पंक्ति_नंबर दिखाएं (प्रति ग्राहक प्रगतिशील ROW_NUMBER, ऑर्डर_एट को आरोही क्रम में ऑर्डर करें)। ग्राहक_आईडी और पंक्ति संख्या के आधार पर ऑर्डर करें।

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

विभाजन के भीतर ROW_NUMBER हमेशा अद्वितीय होता है।

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