窗口函数(开窗函数)及OVER子句(4):聚合嵌套及窗口函数的其余问题

窗口函数(开窗函数)及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()是错误的。

作者:黄邦勇帅(原名:黄勇)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/hyongilfmmm/article/details/93890525
今日推荐