簡體   English   中英

如何根據另一列的值獲取列的不同計數

[英]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

在這里演示:

SQLFiddle

使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM