2010-01-06 19 views
6

मैं देख रहा हूँ की तरहक्या गिनती (*)% 2 = 1

select * 
from Table1 
group by Step 
having count(*) % 2 = 1 

एक प्रश्न चाल क्या है के बारे में having count(*) % 2 = 1

किसी को भी व्याख्या कर सकते हैं क्या है?

संपादित करें: सामान्य उपयोग क्षेत्र क्या हैं?

+4

यह क्या डीबी है के लिए? नीचे दिए गए उत्तरों का क्या सच है, हालांकि, मुझे आश्चर्य है कि यह ग्रुप बाय में एक चयन * के साथ चलता है। यह एमएस एसक्यूएल सर्वर में काम नहीं करेगा क्योंकि आप किसी भी चीज का चयन नहीं कर सकते हैं जिसे समूहबद्ध या समेकित नहीं किया गया है। –

+1

@ रॉबिन डे: मुझे पता है कि एकमात्र तरीका यह होगा कि 'टेबल 1' में एकमात्र कॉलम' चरण' –

+0

है, यह एसक्यूएल सर्वर –

उत्तर

21

अच्छी तरह से% मॉड्यूलो ऑपरेटर है, जो एक विभाजन का शेष देता है, इसलिए यह 0 देता है जब संख्या 2 (यहां तक) और 1 तक बिल्कुल विभाजित होती है (उदा। यह अजीब है)। इसलिए क्वेरी मूल रूप से उन तत्वों का चयन करती है जिनके लिए गणना अजीब है (ऊपर बताई गई अनुसार)।

+0

ठीक है मैं समझता हूं कि मॉड्यूल ऑपरेटर क्या है। लेकिन मैं यह नहीं पूछ रहा हूँ! चाल क्या है, प्रोग्रामर इस कथन का उपयोग क्यों करता है, इसके पीछे पैटर्न क्या है? आदि –

+1

यह चाल हर दूसरे तत्व (विशेष रूप से बाधाओं) का चयन करना है - यह एक साधारण है। यदि आप यह जानना चाहते हैं कि वे ऐसा क्यों कर रहे हैं, तो शायद यह संदर्भ पर निर्भर करता है (उदा। वे वास्तव में क्या चुन रहे हैं?)। – ternaryOperator

+1

कहें कि आप अजीब और यहां तक ​​कि प्रविष्टियों को दो स्तंभों में अलग करना चाहते हैं। आप उनमें से एक के लिए भी एक और दूसरे के लिए अजीब का उपयोग कर सकते हैं। क्या यह मदद करता है? – Hazior

15

क्या यह जांच नहीं करेगा कि क्या आपके पास प्रति चरण प्रविष्टियों की एक बड़ी संख्या है?

4

यह उन सभी चरणों को वापस कर देगा जिनमें पंक्तियों की विषम संख्या थी।

1

COUNT (*) डेटाबेस में सभी पंक्तियों की गणना करेगा। % मॉड्यूलस कैरेक्टर है, जो आपको विभाजन की शेष समस्या देगा। तो यह दो से सभी पंक्तियों को विभाजित और वे जो 1 के एक शेष राशि लौटा रहा है (पंक्तियों की एक विषम संख्या अर्थ।)

एरिक के रूप में बताया, कि सभी पंक्तियों नहीं होगा, बल्कि लोगों को कदम के आधार पर वर्गीकृत , जिसका मतलब है कि यह प्रति कदम सभी विषम पंक्तियां हैं।

+0

यह पंक्तियों द्वारा समूहीकृत पंक्तियों की गणना करेगा। – erikkallen

+0

धन्यवाद, मैंने ग्रुप बाय चरण को नोटिस नहीं किया था। –

1

यह करने के लिए एक कारण:

आप दो स्तंभों में अजीब और यहां तक ​​कि प्रविष्टियों अलग करना चाहते हैं। आप उनमें से एक के लिए भी एक और दूसरे के लिए अजीब का उपयोग कर सकते हैं।

मैंने इसे एक टिप्पणी में भी रखा लेकिन प्रतिक्रिया नहीं मिली।

+0

हाँ आप सही हैं ... यह एक कारण हो सकता है। –

1

हमारे प्रश्नों का उत्तर देने के बिना हमारे प्रश्नों का उत्तर देना असंभव है कि टेबल का उपयोग किस प्रकार किया जाता है।

किसी दिए गए "चरण" यह हो सकता है कि यह "कुछ" की समान मात्रा के लिए आवश्यक है और इस तत्वों की सूची का उत्पादन करेगा कि कुछ इंटरफ़ेस में प्रदर्शित करने के लिए जहां यह स्थिति नहीं है के लिए

उदाहरण: चलिए एक पल के लिए "कदम" भूल जाते हैं और मानते हैं कि यह छात्रों की एक तालिका थी और "चरण" इसके बजाय छात्रों को "समूह" में विचलित किया गया था। एक समूह के लिए एक आवश्यकता यह है कि छात्रों की संख्या भी है क्योंकि छात्र जोड़े में काम करेंगे। एक प्रशासनिक उपकरण के लिए आप समूह की एक सूची देखने के लिए इस तरह की एक क्वेरी लिख सकते हैं जहां यह सत्य नहीं है।

समूह: गणना ए, 10 बी, 9 सी, 17 डी, 8 ई, 4 एफ, 5

और क्वेरी समूहों बी, सी वापस आ जाएगी, एफ

0

सभी को धन्यवाद। आप सभी ने कहा कि क्वेरी समूहबद्ध पंक्तियों को लौटाती है जिनमें अजीब गिनती है।

लेकिन यह बात नहीं है! मैं इस मामले का निरीक्षण करना जारी रखूंगा और प्रोग्रामर के दिमाग में कारण लिखूंगा (अगर मुझे लगता है कि यह कौन लिखता है)

सबक सीखा: प्रोग्रामर को बेवकूफ तर्क के बारे में टिप्पणी लिखनी चाहिए ...

+1

मुझे नहीं लगता कि तर्क गलत है, यह बस बुरी तरह कोडित है। यदि डेवलपर * कोड के बजाए चरण का उपयोग करता है तो कोड स्वयं स्पष्टीकरणपूर्ण होगा और टिप्पणियों की आवश्यकता नहीं होगी, विवरण के लिए मेरा उत्तर देखें – kristof

2

बस इसे

declare @t1 table (step char(1)) 
insert into @t1(step) 
select 'a' 
union all select 'b' 
union all select 'b' 
union all select 'c' 
union all select 'c' 
union all select 'c' 
union all select 'd' 
union all select 'd' 
union all select 'd' 
union all select 'd' 


select * from @t1 
group by step 
having count(*)%2 = 1 

उस स्तंभ कदम का मान जोड़ने मौजूद है कि वापस आ जाएगी परीक्षण बार

इस उदाहरण में की संख्या में यह

'a' 
'c' 

select * वापस आ जाएगी यहाँ हालांकि भ्रामक और मैं इसे

select step from @t1 
group by step 
having count(*)%2 = 1 
के रूप में लिखूंगा

या इससे भी अधिक दृश्यता

select step, count(*) from @t1 
group by step 
having count(*)%2 = 1 
+1

विस्तृत नमूना के लिए धन्यवाद ... –

+0

आपका स्वागत है, मुझे यह स्वीकार करना होगा कि जब मैंने पहली बार कोड देखा था तो मैं स्वीकार करता था सुनिश्चित नहीं है कि क्या हो रहा था, और यह "चयन *" के उपयोग के कारण था – kristof

संबंधित मुद्दे