SQL क्वेरी में हम 1,2,3 द्वारा समूह और 1 का उपयोग क्यों करते हैं?


26

SQL क्वेरी में, हम समूह का उपयोग समुच्चय को लागू करने के लिए खंड द्वारा करते हैं।

  • लेकिन क्लॉज द्वारा समूह के साथ कॉलम नाम के बजाय संख्यात्मक मान का उपयोग करने के पीछे क्या उद्देश्य है? उदाहरण के लिए: समूह 1 से।

3
प्रॉम्प्ट order by 1पर बैठकर ही इस्तेमाल करें mysql> । कोड में, उपयोग करें ORDER BY id ASC। मामले पर ध्यान दें, स्पष्ट फ़ील्ड नाम, और स्पष्ट क्रम निर्देश।
१०:१४ डॉट १

जवाबों:


28

यह वास्तव में IMHO करने के लिए वास्तव में एक बुरी बात है, और यह अधिकांश अन्य डेटाबेस प्लेटफार्मों में समर्थित नहीं है।

लोग इसे करते हैं:

  • वे आलसी हैं - मुझे नहीं पता कि लोगों को लगता है कि बहुत अधिक शाब्दिक कोड प्राप्त करने के लिए अतिरिक्त 40 मिलीसेकंड के लिए टाइपिंग कोड लिखने के बजाय उनकी उत्पादकता में सुधार हुआ है।

इसके खराब होने के कारण:

  • यह स्व-दस्तावेजीकरण नहीं है - किसी को समूह का पता लगाने के लिए चयन सूची को पार्स करने जाना है। यह वास्तव में SQL सर्वर में थोड़ा और स्पष्ट होगा, जो चरवाहे का समर्थन नहीं करता है जो जानता है कि क्या-क्या-क्या होता है जैसे MySQL करता है।

  • यह भंगुर है - कोई व्यक्ति चयन सूची में आता है और बदल जाता है क्योंकि व्यावसायिक उपयोगकर्ता एक अलग रिपोर्ट आउटपुट चाहते थे, और अब आपका आउटपुट गड़बड़ है। यदि आपने GROUP BY में कॉलम नामों का उपयोग किया था, तो SELECT लिस्ट में ऑर्डर अप्रासंगिक होगा।

SQL सर्वर ORDER का समर्थन करता है [क्रम]; यहाँ इसके उपयोग के खिलाफ कुछ समानांतर तर्क दिए गए हैं:


9

MySQL आपको GROUP BYउपनामों के साथ करने की अनुमति देता है ( स्तंभ के साथ समस्याएँ )। यह बेहतर होगा कि GROUP BYसंख्याओं के साथ कर रहे हैं ।

Google के पास इसका उपयोग करने के कई उदाहरण हैं और कई लोगों ने इसका उपयोग करना बंद कर दिया है।

आप के साथ ईमानदारी से कहूं तो मैं के लिए स्तंभ संख्या इस्तेमाल नहीं किया है ORDER BYऔर GROUP BY1996 के बाद से (मैं समय पर ओरेकल PL / SQL विकास कर रहा था)। स्तंभ संख्याओं का उपयोग करना वास्तव में पुराने समय के लिए है और पिछड़ी संगतता ऐसे डेवलपर्स को MySQL और अन्य RDBMS का उपयोग करने की अनुमति देती है जो अभी भी इसके लिए अनुमति देते हैं।


8

मामले के नीचे विचार करें:

+------------+--------------+-----------+
| date       | services     | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Apps         |         1 |
| 2016-05-31 | Applications |         1 |
| 2016-05-31 | Applications |         1 |
| 2016-05-31 | Apps         |         1 |
| 2016-05-31 | Videos       |         1 |
| 2016-05-31 | Videos       |         1 |
| 2016-06-01 | Apps         |         3 |
| 2016-06-01 | Applications |         4 |
| 2016-06-01 | Videos       |         2 |
| 2016-06-01 | Apps         |         2 |
+------------+--------------+-----------+

आपको एप्लिकेशन और एप्लिकेशन को एक ही सेवा मानते हुए प्रति दिन प्रति सेवा डाउनलोड की संख्या का पता लगाना है। द्वारा समूहीकृत करने के date, servicesपरिणामस्वरूप Appsऔर Applicationsअलग-अलग सेवाओं पर विचार किया जाएगा ।

उस स्थिति में, क्वेरी होगी:

 select date, services, sum(downloads) as downloads
 from test.zvijay_test
 group by date,services

और आउटपुट:

+------------+--------------+-----------+
| date       | services     | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications |         2 |
| 2016-05-31 | Apps         |         2 |
| 2016-05-31 | Videos       |         2 |
| 2016-06-01 | Applications |         4 |
| 2016-06-01 | Apps         |         5 |
| 2016-06-01 | Videos       |         2 |
+------------+--------------+-----------+

लेकिन यह वह नहीं है जो आप चाहते हैं कि एप्लिकेशन और एप्लिकेशन को समूहबद्ध किया जाए। तो हम क्या कर सकते हैं?

एक तरह से बदलने के लिए है Appsके साथ Applicationsएक का उपयोग कर CASEअभिव्यक्ति या IFसमारोह और फिर उन्हें के रूप में सेवाओं पर समूहीकरण:

select 
  date,
  if(services='Apps','Applications',services) as services,
  sum(downloads) as downloads
from test.zvijay_test 
group by date,services

लेकिन यह अभी भी सेवाओं को अलग-अलग सेवाओं के रूप में मानता है Appsऔर Applicationsपहले जैसा ही आउटपुट देता है:

+------------+--------------+-----------+
| date       | services     | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications |         2 |
| 2016-05-31 | Applications |         2 |
| 2016-05-31 | Videos       |         2 |
| 2016-06-01 | Applications |         4 |
| 2016-06-01 | Applications |         5 |
| 2016-06-01 | Videos       |         2 |
+------------+--------------+-----------+

स्तंभ संख्या पर समूह बनाना आपको डेटा को किसी अन्य स्तंभ पर समूहित करने की अनुमति देता है।

select
  date,
  if(services='Apps','Applications',services) as services,
  sum(downloads) as downloads
from test.zvijay_test
group by date,2;

और इस प्रकार आप नीचे दिए गए वांछित आउटपुट दे रहे हैं:

+------------+--------------+-----------+
| date       | services     | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications |         4 |
| 2016-05-31 | Videos       |         2 |
| 2016-06-01 | Applications |         9 |
| 2016-06-01 | Videos       |         2 |
+------------+--------------+-----------+

मैंने कई बार पढ़ा है कि यह प्रश्नों को लिखने का एक आलसी तरीका है या किसी अन्य कॉलम का समूह MySQL में काम नहीं करता है, लेकिन यह अलियास कॉलम पर समूह बनाने का तरीका है।

यह प्रश्नों को लिखने का पसंदीदा तरीका नहीं है, इसका उपयोग केवल तब करें जब आपको वास्तव में किसी अन्य स्तंभ पर समूह बनाने की आवश्यकता हो।


" लेकिन यह अभी भी ऐप और एप्लिकेशन को अलग-अलग सेवाओं के रूप में मानते हुए सेवाएं प्रदान करता है और पहले जैसा ही आउटपुट देता है "। यदि आपने उपनाम के लिए अलग (गैर-परस्पर विरोधी) नाम चुना है, तो क्या यह हल नहीं होगा?
डैडी 32

3

इसका उपयोग करने का कोई वैध कारण नहीं है। यह केवल एक आलसी शॉर्टकट है जिसे विशेष रूप से कुछ हार्ड-प्रेशर डेवलपर के लिए मुश्किल से बनाया गया है ताकि वह अपने ग्रुपिंग का पता लगा सके या बाद में छांट सके या किसी को कॉलम क्रम में बदलाव करने पर कोड को गलत तरीके से विफल होने दे सके। अपने साथी डेवलपर्स का ध्यान रखें और ऐसा न करें।


0

यह मेरे लिए काम किया है। कोड समूहों को 5 समूहों तक पंक्तियों में विभाजित करता है।

SELECT
USR.UID,
USR.PROFILENAME,
(
    CASE 
    WHEN MOD(@curRow, 5) = 0 AND @curRow > 0 THEN
        @curRow := 0
    ELSE
        @curRow := @curRow + 1 
        /*@curRow := 1*/ /*AND @curCode := USR.UID*/
    END
) AS sort_by_total  
FROM
    SS_USR_USERS USR,
    (
        SELECT
            @curRow := 0,
            @curCode := ''
    ) rt
ORDER BY
    USR.PROFILENAME,
    USR.UID

परिणाम निम्नानुसार होगा

यहाँ छवि विवरण दर्ज करें


0
SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2;

SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2,3;

ऊपर दिए गए प्रश्नों पर विचार करें: 1 समूह के समूह का मतलब पहले कॉलम से समूह और 1,2 का समूह पहले और दूसरे कॉलम का समूह और समूह का 1,2,3 का मतलब पहले दूसरे और तीसरे कॉलम का समूह। उदाहरण के लिए:

1,2 द्वारा समूह

यह छवि 1,2 द्वारा समूहीकृत पहले दो स्तंभों को दिखाती है, यह गिनती खोजने के लिए dep_date के विभिन्न मूल्यों पर विचार नहीं कर रहा है (गणना करने के लिए पहले दो स्तंभों के सभी विशिष्ट संयोजनों को ध्यान में रखा गया है) जबकि दूसरी क्वेरी का परिणाम यह है 1,2,3 द्वारा समूह

छवि। यहां यह सभी पहले तीन कॉलमों पर विचार कर रहा है और गिनती को खोजने के लिए अलग-अलग मूल्य हैं, यह पहले तीन कॉलमों को समूहीकृत कर रहा है (गणना करने के लिए पहले तीन कॉलमों के सभी विशिष्ट संयोजनों को ध्यान में रखा जाता है)।

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