窗户技巧(滑动窗口函数)与OVER语句(四): 聚合与嵌套问题,以及更多关于窗口函数的探讨
最编程
2024-07-23 07:14:05
...
窗口函数(开窗函数)及OVER子句(4):聚合嵌套及窗口函数的其余问题
若觉得本文写得还可以,请多多关注本人所作书籍《C++语法详解》电子工业出版社出版,作者 黄勇,网盘地址:
https://pan.baidu.com/s/1dIxLMN5b91zpJN2sZv1MNg
五、聚合嵌套及窗口函数的其余问题
1、窗口函数不能嵌套在窗口函数或其他聚合中,但分组聚合函数可以嵌套在窗口函数中,比如
select b,c
--,SUM( SUM(c) over() ) over() --错误,窗口函数不能嵌套于窗口函数中
,SUM(SUM(c)) OVER() --正确,因为内部的SUM(c)没有OVER子句,所以该函数
--是分组聚合函数而非窗口函数,这种情况的嵌套是允许的
from T4 group by b,c
对于SUM( SUM (c )) OVER()可能有点不好理解,若将其分解为两步,就比较清楚其中的逻辑了,第一步是,内部的SUM ©,如下
select b,c ,SUM(c)AS x from T4 group by b,c
然后把SUM ©求得的结果x(别名)用于窗口聚合函数中,由此可见,SUM(SUM©)OVER()只是把分组聚合别名这一步骤进行了合并,注意:以下语句是错误的
select b,c
,sum(c) AS x --为分组聚合的结果取一个别名
,sum(x) over() --错误,这里不能使用别名x,因为别名x在此时还未创建
--成功,这是SELECT语句的同时性概念问题
from T4 group by b,c
SUM( SUM (c )) OVER()还可使用CTE来代替,这样逻辑上更清晰,其等效语句如下
WITH D AS(select b,c,sum(c) as x from T4 group by b,c) --把分组聚合包含在CTE中
select b,c,SUM(x)over() from D; --把窗口聚合包含在外部查询中
2、聚合嵌套的实际应用
3、筛选需要聚合的列,使用CASE表达式来筛选需要聚合的列,比如
4、SQL Server2017目前还不支持以下功能
1)、RANG的INTERVAL选项,该选项可实现类似在ROWS中使用数值来指定行数的功能,这是标准SQL的功能
2)、窗口框架排除:这也是标准SQL的功能,该功能可实现框架是否包含当前行及与当前行有相同值的行。
3)、不能在窗口聚合函数中使用DISTINCT,比如SUM (DISTINCT c) OVER()是错误的。
作者:黄邦勇帅(原名:黄勇)