在Oracle中分组vs分区

时间:2011-07-27 16:21:16

标签: sql oracle data-warehouse analytic-functions

我正在编写一个查询来从Oracle仓库中获取记录。它是一个简单的Select Query,在几个表上有连接,我有很少的列要聚合。因此,我最终在其余列上使用Groupby。

假设我正在挑选大约10列,其中5列是聚合列。所以我需要在其他5列上分组。我甚至可以通过不执行Groupby并在我想要派生的每个聚合列上使用over(paritition by)子句来实现相同目的。

我不确定哪个更适合仓库或一般。

3 个答案:

答案 0 :(得分:20)

它们不一样。

这将返回3行:

select deptno, count(*) c from emp group by deptno;

DEPTNO C
------ -
10     3
20     5
30     6

这将返回14:

select deptno, count(*) over (partition by deptno) c from emp;


DEPTNO C
------ -
10     3
10     3
10     3
20     5
20     5
20     5
20     5
20     5
30     6
30     6
30     6
30     6
30     6
30     6

答案 1 :(得分:6)

Check this link 聚合函数和分析函数之间的主要区别在于,尽管分析函数提供聚合结果,但它们不会对结果集进行分组。它们会在每条记录中多次返回组值。

答案 2 :(得分:-1)

使用PARTITON BY,可以在一个查询中执行此操作以获得不同的计算或分组。

select
     DISTINCT deptno, count(*) over (partition by deptno) c,
     COUNT(*) OVER (PARTITION BY NULL) AS TOTAL
from emp;