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

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

在这里插入图片描述

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值