फ़िल्टर खंड का उपयोग करते समय अजीब व्यवहार - एसक्यूएल, प्रदर्शन, postgresql

मेरे पास दो प्रश्न हैं

SELECT COUNT(DISTINCT keyword_id),
date_trunc("month", rank_date) AS date
FROM keyword_ranks, keywords
WHERE keywords.deleted_at IS NULL
AND keywords.id=keyword_ranks.keyword_id
AND keywords.business_id=27 GROUP BY date_trunc("month", rank_date);

परिणाम-सेट है

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

अब मैंने कुछ जोड़ा है FILTER जैसे खंड

SELECT COUNT(DISTINCT keyword_id) FILTER (WHERE rank>50 OR rank is null) AS "50+",
COUNT(DISTINCT keyword_id) FILTER (WHERE rank BETWEEN 21 AND 50) AS "21-50",
COUNT(DISTINCT keyword_id) FILTER (WHERE rank BETWEEN 11 AND 20) AS "11-20",
COUNT(DISTINCT keyword_id) FILTER (WHERE rank BETWEEN 4 AND 10) AS "4-10",
COUNT(DISTINCT keyword_id) FILTER (WHERE rank BETWEEN 1 AND 3) AS "1-3",
date_trunc("month", rank_date) AS date
FROM keyword_ranks, keywords
WHERE keywords.deleted_at IS NULL
AND keywords.id=keyword_ranks.keyword_id
AND keywords.business_id=27 GROUP BY date_trunc("month", rank_date);

जिसके परिणामस्वरूप सेट है

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

जैसा कि आप पहले प्रश्न परिणाम से देख सकते हैं, अलग-अलग गिनती keyword_id हर महीने 147 है। लेकिन उपयोग करते समय गिनती क्यों है FILTER खंड 147 से अधिक जोड़ते हैं? यदि यह अलग-अलग गिनती प्राप्त करने का तरीका नहीं है, तो इसके बारे में कैसे जाना है। कृपया मेरे नौसिखिया प्रश्न के साथ भालू। किसी भी मदद की बहुत सराहना की

उत्तर:

उत्तर № 1 के लिए 1

आईडी एक रैंक के भीतर अलग हैं लेकिन कुल के भीतर नहीं। इस उदाहरण की जांच करें:

with v (id, rank) as (values (1,1),(1,10))
select
count(distinct id) as total,
count(distinct id) filter (where rank < 10) as "< 10",
count(distinct id) filter (where rank >= 10) as ">= 10"
from v
;
total | < 10 | >= 10
-------+------+-------
1 |    1 |     1

कुल मिलाकर रैंकिंग के योग को बनाने का एकमात्र तरीका अलग-अलग उपयोग नहीं करना है।

with v (id, rank) as (values (1,1),(1,10))
select
count(id) as total,
count(id) filter (where rank < 10) as "< 10",
count(id) filter (where rank >= 10) as ">= 10"
from v
;
total | < 10 | >= 10
-------+------+-------
2 |    1 |     1

संबंधित सवाल
सबसे लोकप्रिय