समस्या:
आप अपने डेटा को वर्ष के अनुसार समूहित करना चाहते हैं।
उदाहरण I:
आपके डेटा में एक कॉलम है transaction_date
. इसमें एक तारीख होती है। आप अपने सभी डेटा को वर्ष के अनुसार समूहित करना चाहते हैं और प्रत्येक वर्ष अर्जित कुल धन की गणना करना चाहते हैं।
data
तालिका इस तरह दिखती है:
लेनदेन_तिथि | पैसा |
---|---|
2018-03-25 | 1700 |
2019-09-12 | 100 |
2018-07-14 | 1200 |
2018-01-05 | 400 |
2019-06-08 | 2000 |
2020-03-06 | 1500 |
समाधान 1 (वर्ष और अर्जित धन को प्रदर्शित करना):
SELECT EXTRACT(year FROM transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY EXTRACT(year FROM transaction_date);
नतीजा यह है:
वर्ष | पैसा_कमाया |
---|---|
2020 | 1500 |
2019 | 2100 |
2018 | 3300 |
समाधान 2 (पूर्ण तिथि, वर्ष और संबंधित वर्ष में अर्जित धन को प्रदर्शित करना):
SELECT transaction_date AS transaction_date, EXTRACT(year FROM transaction_date) AS year, SUM(money) OVER(PARTITION BY EXTRACT(year FROM transaction_date)) AS money_earned FROM data;
नतीजा यह है:
लेनदेन_तिथि | वर्ष | पैसा_कमाया |
---|---|---|
2018-03-25 | 2018 | 3300 |
2018-07-14 | 2018 | 3300 |
2018-01-05 | 2018 | 3300 |
2019-09-12 | 2019 | 2100 |
2019-06-08 | 2019 | 2100 |
2020-03-06 | 2020 | 1500 |
चर्चा:
इस उदाहरण में यह माना जाता है कि आपके पास year
नहीं है कॉलम। इसके बजाय आपके पास पूर्ण तिथियों वाला कॉलम है।
सबसे पहले, आपको तिथि से एक वर्ष पुनर्प्राप्त करने की आवश्यकता है। आप EXTRACT(part FROM date)
. का उपयोग कर सकते हैं करने का कार्य करते हैं। आपके मामले में, आप वर्ष निकालना चाहते हैं, इसलिए part
year
है . date
वह कॉलम है जिसमें तिथियां होती हैं - transaction_date
कॉलम। कॉलम का नाम बदलकर साल-दर-साल करना एक अच्छा विचार है। यदि आप EXTRACT
. के बारे में अधिक जानना चाहते हैं कार्य और तिथि से विभिन्न भागों को कैसे पुनर्प्राप्त करें, आप इसे यहां पा सकते हैं।
यदि आप केवल वर्ष और इस वर्ष अर्जित कुल धन प्रदर्शित करना चाहते हैं, तो आप GROUP BY
का उपयोग कर सकते हैं . पहला चयनित कॉलम दिनांक से निकाला गया वर्ष है। दूसरा कॉलम कुल कार्य है SUM(money)
. क्वेरी के अंत में आपको एक GROUP BY EXTRACT(year FROM transaction_date)
की आवश्यकता होती है या, सरल, GROUP BY 1 (since EXTRACT(year FROM transaction_date)
पहला कॉलम है।)
यदि आप अधिक कॉलम प्रदर्शित करना चाहते हैं, तो आपको एक विंडो फ़ंक्शन (समाधान 2) की आवश्यकता है। SUM(money)
. के बाद आप OVER()
लिखें खंड और, चूंकि आप प्रत्येक वर्ष के लिए राशि की गणना करना चाहते हैं, PARTITION BY EXTRACT(year FROM transaction_date)
का उपयोग करें इसके अंदर। ध्यान दें कि योग की गणना करते समय आपके पास अभी तक वर्ष कॉलम नहीं है, इसलिए PARTITION BY year
काम नहीं करेगा - आपको एक त्रुटि मिलेगी 'column "year" does not exist'
. आप इस लेख में विंडो के कार्यों के बारे में अधिक पढ़ सकते हैं।
उदाहरण II:
आपके डेटा में एक कॉलम है year
. आप अपने सभी डेटा को इस कॉलम के आधार पर समूहित करना चाहते हैं और प्रत्येक वर्ष अर्जित कुल धन की गणना करना चाहते हैं।
data
तालिका इस तरह दिखती है:
वर्ष | माह | <थ>दिनपैसा | |
---|---|---|---|
2018 | 3 | 25 | 1700 |
2019 | 9 | 12 | 100 |
2018 | 7 | 14 | 1200 |
2018 | 1 | 5 | 400 |
2019 | 6 | 8 | 2000 |
2020 | 3 | 6 | 1500 |
समाधान 1 (वर्ष और अर्जित धन को प्रदर्शित करना):
SELECT year, SUM(money) AS money_earned FROM data GROUP BY year;
नतीजा यह है:
वर्ष | पैसा_अर्जित |
---|---|
2020 | 1500 |
2018 | 3300 |
2019 | 2100 |
समाधान 2 (वर्ष, माह, दिन और संबंधित वर्ष में अर्जित धन को प्रदर्शित करना):
SELECT year, month, day, SUM(money) OVER(PARTITION BY year) AS money_earned FROM data;
नतीजा यह है:
वर्ष | माह | <थ>दिनपैसा_अर्जित | |
---|---|---|---|
2018 | 3 | 25 | 3300 |
2018 | 7 | 14 | 3300 |
2018 | 1 | 5 | 3300 |
2019 | 9 | 12 | 2100 |
2019 | 6 | 8 | 2100 |
2020 | 3 | 6 | 1500 |
चर्चा:
इस उदाहरण में यह माना जाता है कि आपके पास पहले से ही year
है कॉलम।
यदि आप वर्ष और इस वर्ष अर्जित कुल धन प्रदर्शित करना चाहते हैं, तो एक आसान GROUP BY
काफी है। यदि आप GROUP BY
. की अवधारणा के साथ सहज महसूस नहीं करते हैं , यहां एक नज़र डालें जहां हम इसे समझाते हैं। आप केवल समग्र फ़ंक्शन का उपयोग करते हैं (यहां:SUM
) सही कॉलम के साथ और क्वेरी के अंत में आप year
. द्वारा समूहित करते हैं . आप AS
. का उपयोग करके कॉलम का नाम बदल सकते हैं एक नए नाम के साथ कीवर्ड।
यदि आप कुछ अन्य कॉलम भी प्रदर्शित करना चाहते हैं तो यह अधिक जटिल है। फिर आपको विंडो फ़ंक्शन (समाधान 2) का उपयोग करके समाधान की आवश्यकता है। आपको उपयुक्त कॉलम के साथ एग्रीगेट फ़ंक्शन का उपयोग करना चाहिए (यहां:SUM(money)
) और OVER()
लिखें बाद में खंड। इस क्लॉज में, आपको PARTITION BY
. का उपयोग करना चाहिए उस कॉलम के साथ जिसके द्वारा आप समूह बनाना चाहते हैं। इस तरह आपको मिलता है:
SUM(money) OVER(PARTITION BY year)
इस समाधान में, आप GROUP BY
. का उपयोग नहीं करते हैं खंड।
आप यहां विंडो फ़ंक्शन के बारे में अधिक पढ़ सकते हैं।