[英]How to get distinct count of a column based on value of another column
如何根據另一列的值獲得列的不同計數?
我可以理解這可以通過創建另一個中間表來實現,但我在數十億行的表上運行此查詢,所以如果我們可以在一個查詢中獲得結果而不是創建另一個分組會更好。
以下是測試的示例創建代碼。
CREATE TABLE MYGROUP ( Category,PERSON,Flag ) AS
SELECT 'Cat1','A','1' FROM DUAL
UNION ALL SELECT 'Cat1','A','0' FROM DUAL
UNION ALL SELECT 'Cat1','A','1' FROM DUAL
UNION ALL SELECT 'Cat1','B','1' FROM DUAL
UNION ALL SELECT 'Cat1','B','0' FROM DUAL
UNION ALL SELECT 'Cat2','A','0' FROM DUAL
UNION ALL SELECT 'Cat2','A','0' FROM DUAL
UNION ALL SELECT 'Cat2','A','0' FROM DUAL
UNION ALL SELECT 'Cat2','B','1' FROM DUAL
UNION ALL SELECT 'Cat2','B','1' FROM DUAL
UNION ALL SELECT 'Cat2','B','0' FROM DUAL
UNION ALL SELECT 'Cat3','X','0' FROM DUAL
UNION ALL SELECT 'Cat3','Y','0' FROM DUAL;
期望的輸出:
Category Count of Distinct Persons with Flag =1
Cat1 2
Cat2 1
Cat3 0
輸出原因A和B都有Flag = 1所以count在第一行是2而且只有B有Flag = 1所以count在第二行是1 Cat3 count是0因為沒有Flag = 1的行
使用COUNT(DISTINCT PERSON)
:
SELECT Category,
COUNT(DISTINCT CASE WHEN Flag = 1 THEN PERSON END) AS distinct_count
FROM MYGROUP
GROUP BY Category
在這里演示:
使用count(distinct decode(flag,1,person,null))
它將忽略標志不等於“1”並且工作速度更快的人
select category ,count (distinct decode(flag,1,person,null)) countof from MYGROUP
group by category
或者您可以使用分析函數Over (partition by )
子句
通常,分析函數的工作速度更快。 以下是如何為此問題應用分析函數的示例:
select distinct category ,count (distinct decode(flag,1,person,null)) over (partition by category) countof from MYGROUP
查看執行計划,並為您更好地選擇什么
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.