नियमों के साथ COIST DISTINCT


104

मैं एक निश्चित स्थिति के अधीन कॉलम में अलग-अलग मदों की संख्या को गिनना चाहता हूं, उदाहरण के लिए यदि तालिका इस प्रकार है:

tag | entryID
----+---------
foo | 0
foo | 0
bar | 3

अगर मैं अलग-अलग टैग की संख्या को "टैग काउंट" के रूप में गिनना चाहता हूं और एक ही तालिका में "पॉजिटिव टैग काउंट" के रूप में एंट्री आईडी> 0 के साथ अलग-अलग टैगों की संख्या की गणना करना चाहिए, तो मुझे क्या करना चाहिए?

अब मैं दो अलग-अलग तालिकाओं से गिन रहा हूं, जहां दूसरी तालिका में मैंने केवल उन पंक्तियों को चुना है जिनका प्रवेश शून्य से बड़ा है। मुझे लगता है कि इस समस्या को हल करने के लिए एक अधिक कॉम्पैक्ट तरीका होना चाहिए।

जवाबों:


258

आप यह कोशिश कर सकते हैं:

select
  count(distinct tag) as tag_count,
  count(distinct (case when entryId > 0 then tag end)) as positive_tag_count
from
  your_table_name;

पहला count(distinct...)आसान है। दूसरा वाला, कुछ जटिल दिखता है, वास्तव में पहले वाले के समान है, सिवाय इसके कि आप case...whenक्लॉज का उपयोग करते हैं । में case...whenखंड, आप केवल सकारात्मक मूल्यों को फ़िल्टर। शून्य या नकारात्मक मानों का मूल्यांकन किया जाएगाnull जाएगा और उन्हें गणना में शामिल नहीं किया जाएगा।

यहां एक बात ध्यान देने वाली है कि एक बार टेबल को पढ़कर ऐसा किया जा सकता है। जब ऐसा लगता है कि आपको एक ही तालिका को दो या अधिक बार पढ़ना है, तो यह वास्तव में अधिकांश समय में एक बार पढ़कर किया जा सकता है। परिणामस्वरूप, यह कम I / O के साथ कार्य को बहुत तेज़ी से समाप्त कर देगा।


2
लेकिन तब सकारात्मक_टैग_काउंट भी अलग होगा?
derekhh

संपादित क्वेरी अभी भी समस्या का समाधान नहीं करती है - क्या यह अब अलग-अलग टैगों के बजाय अलग-अलग एंट्रीआईड मानों पर काम नहीं कर रही है?
ब्रायनक डेस

यह वास्तव में एक चतुरता है।
ल्यूक

मेरे पास मेरे अलग-अलग कॉलम हैं (उदाहरण संख्या (विशिष्ट टैग, दिनांक))। क्या तत्कालीन खंड में कई कॉलम रखने का एक तरीका है। अगर मैं सिर्फ एक टैग करता हूं, तो यह एक अपवाद को छोड़ देता है
क्रुसेडरिप्रो

@Crusaderpyro मूल प्रश्न के दायरे से परे है। मैं उसके लिए एक नया प्रश्न बनाऊंगा।
23'18

2

निम्नलिखित कथन आज़माएँ:

select  distinct A.[Tag],
     count(A.[Tag]) as TAG_COUNT,
     (SELECT count(*) FROM [TagTbl] AS B WHERE A.[Tag]=B.[Tag] AND B.[ID]>0)
     from [TagTbl] AS A GROUP BY A.[Tag]

पहला क्षेत्र टैग होगा, दूसरा संपूर्ण गणना होगा और तीसरा सकारात्मक अंक होगा।


1

यह काम कर सकता है:

SELECT Count(tag) AS 'Tag Count'
FROM Table
GROUP BY tag

तथा

SELECT Count(tag) AS 'Negative Tag Count'
FROM Table
WHERE entryID > 0
GROUP BY tag

0

यह भी काम कर सकता है:

SELECT 
    COUNT(DISTINCT T.tag) as DistinctTag,
    COUNT(DISTINCT T2.tag) as DistinctPositiveTag
FROM Table T
    LEFT JOIN Table T2 ON T.tag = T2.tag AND T.entryID = T2.entryID AND T2.entryID > 0

आपको यह सुनिश्चित करने के लिए कि जहाँ कोई आइटम केवल 0 में एक एंटिडिड है, को पहले DISTINCT में ठीक से गिना जाता है ताकि यह सुनिश्चित करने के लिए कि आपको बाईं ओर से जुड़ने की स्थिति में एंट्री की स्थिति की आवश्यकता है।


1
यह क्वेरी तालिका को दो बार पढ़ती है। इसे केवल एक बार तालिका पढ़कर किया जा सकता है।
नटल्ब

0

कोड [एंट्री आईडी]> 0 होने पर टैग और एंट्री आईडी के अद्वितीय / विशिष्ट संयोजन को गिना जाता है

select count(distinct(concat(tag,entryId)))
from customers
where id>0

आउटपुट में यह अद्वितीय मानों की गिनती प्रदर्शित करेगा आशा है कि यह मदद करता है

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