Sql Oracle中的分组方式与分区方式

Sql Oracle中的分组方式与分区方式,sql,oracle,data-warehouse,analytic-functions,Sql,Oracle,Data Warehouse,Analytic Functions,我正在编写一个查询以从Oracle仓库获取记录。这是一个简单的Select查询,在几个表上有连接,我有几个要聚合的列。因此,我最终在其余列上使用Groupby 假设我选择了大约10列,其中5列是聚合列。所以我需要对其他5列进行分组。我甚至可以通过不使用Groupby并对我想要导出的每个聚合列使用over(parititionby)子句来实现同样的效果 我不确定哪一个比仓库或一般情况更好。它们不一样 这将返回3行: select deptno, count(*) c from emp group

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

假设我选择了大约10列,其中5列是聚合列。所以我需要对其他5列进行分组。我甚至可以通过不使用Groupby并对我想要导出的每个聚合列使用over(parititionby)子句来实现同样的效果

我不确定哪一个比仓库或一般情况更好。

它们不一样

这将返回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

聚合函数和分析函数之间的主要区别在于,虽然分析函数给出聚合结果,但它们不会对结果集进行分组。它们在每条记录中多次返回组值

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

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

我在努力理解。如果我错了,请纠正我。所以,如果我得到第二个查询的不同结果,它将给出第一个查询结果。我使用partition只对基于分区列的某个子句执行rank(),并获得第一个秩左右。在什么情况下,第二个查询结果会有用?谢谢,我想说,如果可以使用GROUP BY完成,那就更好了。分析函数应该用于需要单个行加上一些聚合信息的情况,如rank()示例。