如何在多个列上进行COUNT DISTINCT?

6

我有以下表格。

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 + version的数量。我有以下查询语句。
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

你只需要这个吗?-- http://sqlfiddle.com/#!4/c9217/9 - Taryn
子查询不一定更慢。Oracle 在优化这些方面特别擅长。 - GolezTrol
@bluefeet,我想要在同一查询结果中拥有CONT(*)和COUNT(DISTINCT)。 - EricZ
就性能而言,您要多久运行一次此查询? - APC
1个回答

9

我不知道这是否是最好的方法,但通常我会使用一个分隔符将两个值连接起来以强制实现“不同性”,从而使它们成为一个表达式,这样Oracle可以通过COUNT DISTINCT来处理:

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

不错!我之前没想过这一点。现在我会尝试一下。 - EricZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接