我正在编写一个查询以从 Oracle 仓库中获取记录。它是一个简单的选择查询,在几个表上连接,我有几个列要聚合。因此,我最终在其余列上使用 Groupby。
假设我选择了 10 列,其中 5 列是聚合列。所以我需要按其他 5 列分组。我什至可以通过不执行 Groupby 并在我想要派生的每个聚合列上使用 over (partition by) 子句来实现相同的目的。
我不确定哪个更适合仓库或一般情况。
我正在编写一个查询以从 Oracle 仓库中获取记录。它是一个简单的选择查询,在几个表上连接,我有几个列要聚合。因此,我最终在其余列上使用 Groupby。
假设我选择了 10 列,其中 5 列是聚合列。所以我需要按其他 5 列分组。我什至可以通过不执行 Groupby 并在我想要派生的每个聚合列上使用 over (partition by) 子句来实现相同的目的。
我不确定哪个更适合仓库或一般情况。
它们是不相同的。
这将返回 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
检查此链接 聚合函数和分析函数之间的主要区别在于,尽管分析函数给出聚合结果,但它们不会对结果集进行分组。他们在每条记录中多次返回组值。
可以在PARTITON BY
一个查询中执行此操作以获取不同的计算或分组依据。
select
DISTINCT deptno, count(*) over (partition by deptno) c,
COUNT(*) OVER (PARTITION BY NULL) AS TOTAL
from emp;