有一张桌子:
create table dennis_t (name varchar2(20), val int);
insert into dennis_t values ('a',1);
insert into dennis_t values ('a',2);
insert into dennis_t values ('a',3);
insert into dennis_t values ('b',6);
insert into dennis_t values ('c',2);
insert into dennis_t values ('c',3);
insert into dennis_t values ('c',4);
insert into dennis_t values ('c',5);
以下查询返回预期结果
select name,
avg(val) over (partition by name),
max(val) over (partition by name)
from dennis_t
但是,如果我将 order by 子句添加到分析函数体中,如下所示:
select name,
avg(val) over (partition by name order by val),
max(val) over (partition by name order by val)
from dennis_t
返回值将与之前的值不同,因为它将实现滑动窗口技术。
可以请任何人解释为什么会这样吗?我认为,即使将它们用作分析函数,对于诸如avg和max之类的聚合也不重要。
由于
答案 0 :(得分:2)
所有内容都在documentation:
中某些分析功能允许 windowing_clause 。在本节末尾的分析函数列表中,允许windowing_clause的函数后面跟一个星号(*)。
(文档中较低,AVG
和MAX
后面都有一个星号)
和
如果您完全省略 windowing_clause ,则默认值为“无限制预设和当前行之间的范围”。
所以你的问题:
无论订单如何,平均值应保持不变?
是不正确的,因为对于分区中的第一行,我们只是平均一个值(当前行),而对于分区中的后续行,我们将当前值之前的所有值加上当前值之一。
答案 1 :(得分:1)
将ORDER BY val
添加到over (partition by name order by val)
时,聚合(avg
和max
)会按行完成,即基于{到当前行的所有行当前分区中的{1}}。
对于order by val
,它为整个分区计算一次,而不是为分区中的每一行单独计算。