क्या समूह में कॉलम का क्रम खण्ड द्वारा मायने रखता है?


85

अगर मेरे पास दो कॉलम हैं, तो बहुत उच्च कार्डिनैलिटी वाला और बहुत कम कार्डिनैलिटी वाला (यूनिक # वैल्यूज़), क्या यह इस बात से है कि मैं किस क्रम में ग्रुप बनाऊँ?

यहाँ एक उदाहरण है:

select 
     dimensionName, 
     dimensionCategory, 
     sum(someFact)
from SomeFact f
join SomeDim d on f.dimensionKey = d.dimensionKey
group by 
    d.dimensionName,  -- large number of unique values
    d.dimensionCategory -- small number of unique values

क्या ऐसी स्थितियां हैं जहां यह मायने रखता है?


2
संबंधित पोस्ट साथ ही देखें: MYSQL5 ग्रुप ऑफ ग्रुप द्वारा ...
trcarden

जवाबों:


74

नहीं, आदेश ग्रुप BY क्लॉज के लिए कोई मायने नहीं रखता।

MySQL और SQLite एकमात्र ऐसे डेटाबेस हैं जिनके बारे में मुझे पता है कि आप उन कॉलमों का चयन करने की अनुमति देते हैं जो समूह से छोड़े गए हैं (गैर-मानक, पोर्टेबल नहीं) लेकिन यह क्रम वहां भी मायने नहीं रखता।


27

एसक्यूएल घोषणात्मक है।

इस मामले में, आपने ऑप्टिमाइज़र को बताया है कि आप डेटा को कैसे समूहीकृत करना चाहते हैं और यह काम करता है कि यह कैसे करना है।

यह लाइन (प्रक्रियात्मक) द्वारा लाइन का मूल्यांकन नहीं करेगा और पहले एक कॉलम को देखेगा

अनुक्रमणिका के लिए मुख्य स्थान स्तंभ क्रम मायने रखता है। col1, col2जैसा है वैसा नहीं है col2, col1। बिलकुल।


15
यह ORDER BY के लिए भी मायने रखता है।
विंसेंट मैकनाब

12

माइक्रोसॉफ्ट एसक्यूएल सर्वर की एक विरासत, गैर-मानक सुविधा है जिसे रोलअप कहा जाता है। रोलअप ग्रुप बाय सिंटैक्स का एक एक्सटेंशन है और जब इसका उपयोग किया जाता है तो BY BY कॉलम का क्रम निर्धारित करता है कि किस कॉलम को परिणाम में समूहीकृत किया जाना चाहिए। हालांकि रोलअप को हटा दिया गया है। मानक SQL विकल्प समूहन सेट का उपयोग करना है, जो SQL Server 2008 और बाद के संस्करणों द्वारा समर्थित है।


10

चूंकि यहां इसका उल्लेख नहीं किया गया है। ऊपर दिए गए उत्तर सही हैं अर्थात "समूह द्वारा" खंड के बाद कॉलम का क्रम क्वेरी की शुद्धता (अर्थात राशि) को प्रभावित नहीं करेगा ।

हालाँकि, पंक्तियों के क्रम को "समूह द्वारा" खंड के बाद निर्दिष्ट कॉलम के क्रम के आधार पर अलग-अलग किया जाएगा। उदाहरण के लिए Aनिम्नलिखित पंक्तियों के साथ तालिका पर विचार करें :

Col1 Col2 Col3
1   xyz 100
2   abc 200
3   xyz 300
3   xyz 400

SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1Col2आरोही क्रम से आदेशित पंक्तियों को पुनः प्राप्त करेगा ।

Col1 Col2 Col3 sum(Col3)
2   abc 200 200
1   xyz 100 100
3   xyz 300 700

अब समूह में कॉलम के क्रम को बदल कर बदल दें Col1, Col2। प्राप्त पंक्तियों को आरसी द्वारा आदेश दिया जाता है Col1

अर्थात select *, sum(Col3) from A group by Col1, Col2

Col1 Col2 Col3 sum(Col3)
1   xyz 100 100
2   abc 200 200
3   xyz 300 700

नोट: योग राशि (यानी क्वेरी की शुद्धता) बिल्कुल वैसी ही बनी हुई है।


7
लेकिन, जब तक कि "ORDER BY" का उपयोग नहीं किया जाता है, तब तक चयनित परिणामों की पंक्ति क्रम अनिर्धारित होता है, है न? तो आपको कभी भी पंक्तियों के किसी विशेष क्रम पर भरोसा नहीं करना चाहिए, भले ही ग्रुप बीई का उपयोग न करें।
avl_sweden

@Avl_sweden के लिए सहमत, मुझे लगता है कि प्रतिक्रिया को कम से कम संकेत करना चाहिए कि यह व्यवहार कार्यान्वयन-विशिष्ट है। इस बात की कोई गारंटी नहीं है कि SQL सर्वर का एक नया (या समान) संस्करण एक अलग ऑर्डर नहीं करेगा।
नोबोडिस नाइटमेयर

2

अगर मेरे पास दो कॉलम हैं, तो बहुत उच्च कार्डिनैलिटी वाला और बहुत कम कार्डिनैलिटी वाला (यूनिक # वैल्यूज़), क्या यह इस बात से है कि मैं किस क्रम में ग्रुप बनाऊँ?

क्वेरी-1

SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt  FROM tbl_product_spec 
GROUP BY spec_id, catid, spec_display_value ;

क्वेरी-2

SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt  FROM tbl_product_spec FORCE INDEX(idx_comp_spec_cnt)
GROUP BY catid, spec_id,spec_display_value;

दोनों समान हैं, ऑर्डर क्लॉज द्वारा समूह में काम नहीं करता है।

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