我要計數不同的項目數列中受到了一定的條件,例如,如果表是這樣的:COUNT DISTINCT與條件
tag | entryID
----+---------
foo | 0
foo | 0
bar | 3
如果我要計算不同數標記爲「標記計數」,並在同一個表中將條目ID> 0的不同標記的數目計爲「正確標記計數」,我該怎麼辦?
我現在從兩個不同的表格中,在第二個表格中,我只選擇了entryID大於零的那些行。我認爲應該有更緊湊的方法來解決這個問題。
我要計數不同的項目數列中受到了一定的條件,例如,如果表是這樣的:COUNT DISTINCT與條件
tag | entryID
----+---------
foo | 0
foo | 0
bar | 3
如果我要計算不同數標記爲「標記計數」,並在同一個表中將條目ID> 0的不同標記的數目計爲「正確標記計數」,我該怎麼辦?
我現在從兩個不同的表格中,在第二個表格中,我只選擇了entryID大於零的那些行。我認爲應該有更緊湊的方法來解決這個問題。
你可以試試這個:
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更快地完成任務。
這可能工作:
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
這也可能工作:
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
您需要在左側ENTRYID條件聯接,而不是在where子句中以確保任何只有entryID爲0的項目才能在第一個DISTINCT中正確計數。
該查詢讀取表格兩次。它可以通過只讀表一次來完成。 – ntalbs
試試下面的語句:
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]
的第一場將是標籤上的第二個將是整個計數的三分之一將是正面的計數。
但是,那麼positive_tag_count也會有區別嗎? – derekhh
編輯的查詢仍然不能解決問題 - 是不是現在工作在不同的entryId值而不是不同的標籤? – BrianC
這是一個非常聰明的解決方案。 – Luc