2013-06-28 23 views
3

我有下表。如何在多個列上COUNT DISTINCT

group _id p_id version value 
1    1  1 10 
1    1  2 11 
1    1  2 12 
1    2  3 13 
2    1  2 14 
2    1  3 15 
2    1  2 16 

我想指望每個group_id有多少記錄以及每個group_id有多少個不同的p_id +版本。我已經Aapparently以下查詢

SELECT "group_id",count(*) , count(distinct "p_id","version") 
FROM tbl 
group by "group_id" 

,這是行不通的,因爲Oracle會給我錯誤的COUNT

ORA-00909: invalid number of arguments 

我知道這可以通過子查詢來完成。但是,有沒有簡單的方法來獲得相同的結果?表現的重要性對我來說很重要,因爲我們在表格中有超過5億條記錄。

SQL Fiddle

+0

你只是想要這個嗎? - http://sqlfiddle.com/#!4/c9217/9 – Taryn

+0

子查詢不一定慢。 Oracle尤其擅長優化這些。 – GolezTrol

+0

@bluefeet,我想在同一查詢結果中有CONT(*)和COUNT(DISTINCT)。 – EricZ

回答

6

我不知道這是最好的方式,但我通常將兩者連接起來的值,用分隔符來執行「獨特性」,使他們成爲一個表達,甲骨文可以與COUNT DISTINCT處理:

SELECT "group_id",count(*) , count(distinct "p_id" || '-' || "version") 
FROM tbl 
group by "group_id" 
+0

不錯!之前沒有想過這個。我現在會嘗試 – EricZ