我正在编写一个查询来从Oracle仓库中获取记录。它是一个简单的Select Query,在几个表上有连接,我有很少的列要聚合。因此,我最终在其余列上使用Groupby。
假设我正在挑选大约10列,其中5列是聚合列。所以我需要在其他5列上分组。我甚至可以通过不执行Groupby并在我想要派生的每个聚合列上使用over(paritition by)子句来实现相同目的。
我不确定哪个更适合仓库或一般。
答案 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;