ordery子句更改avg和max函数返回的结果

时间:2015-06-24 07:00:44

标签: sql oracle

有一张桌子:

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之类的聚合也不重要。

由于

2 个答案:

答案 0 :(得分:2)

所有内容都在documentation

  

某些分析功能允许 windowing_clause 。在本节末尾的分析函数列表中,允许windowing_clause的函数后面跟一个星号(*)。

(文档中较低,AVGMAX后面都有一个星号)

  

如果您完全省略 windowing_clause ,则默认值为“无限制预设和当前行之间的范围”。

所以你的问题:

  

无论订单如何,平均值应保持不变?

是不正确的,因为对于分区中的第一行,我们只是平均一个值(当前行),而对于分区中的后续行,我们将当前值之前的所有值加上当前值之一。

答案 1 :(得分:1)

ORDER BY val添加到over (partition by name order by val)时,聚合(avgmax)会按行完成,即基于{到当前行的所有行当前分区中的{1}}。

对于order by val,它为整个分区计算一次,而不是为分区中的每一行单独计算。