- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
SQL Server中开窗函数的用法
开窗函数(OVER子句)用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。举例来说,如果要得到一个年级所有班级所有学生的平均分,按照传统的写法,肯定是通过AVG聚合函数来实现求平均分。由于聚合函数是以GROUP BY 查询作为操作的上下文对一组值进行聚合,GROUP BY 操作对数据进行分组后,查询为每个组只返回一行数据,因此,我们不能同时返回基础列(班级,学生等列),而只能得到聚合列。
开窗函数是在ISO SQL标准中定义的。SQL Server提供排名开窗函数和聚合开窗函数,只有在SELECT和ORDER BY处理阶段才允许使用OVER子句。
以下以表OrderValues为例介绍开窗函数的用法,该表定义如下:
orderid
(订单ID)
custid
(客户ID)
empid
(雇员ID)
orderdate
(订单日期)
val
(订单价格)
10001
A
E1
2010-1-2
5000
10002
A
E2
2010-2-28
4000
10003
A
E4
2010-3-15
4000
10004
A
E1
2010-4-26
4500
10005
A
E1
2010-5-16
4500
10006
B
E1
2010-1-16
1200
10007
B
E4
2010-4-27
1500
10008
B
E3
2010-7-29
1200
10009
C
E4
2010-1-1
10000
10010
C
E2
2010-2-3
10000
聚合开窗函数
聚合开窗函数使用OVER子句提供窗口作为上下文,对窗口中的一组值进行操作,而不是使用GROUP BY子句提供的上下文。这样就不必对数据进行分组,还能够在同一行中同时返回基础行和聚合列。
带有空的圆括号的OVER子句会提供所有行进行计算(这里的“所有行”并不一定是在FROM子句中出现的那些表中的所有行,而是在FROM、WHERE、GROUP BY,以及HAVING处理阶段完成后仍然可用的那些行)。例如,如果对表OrderValues进行查询的SELECT子句中指定了Sum(Val) OVER()表达式,这个函数就会对SELECT阶段操作的所有行计算其总价格。如果想对行进行限制或者分区,则可以可以使用PARTITION BY子句。例如,如果想返回当前客户(与当前行具有相同custid的所有行)的总价格,则可以指定Sum(Val) OVER(PARTITION BY custid)。
执行语句:
select orderid, custid, val,
sum(val) over() as totalvalue,
sum(val) over(partition by custid) as custtotalvalue
from OrderValue
结果如下:
因此,对于在实际应用中的所占百分比的计算,可以借用OVER子句。如要查询当前订单金额占客户订单总金额的百分比,可以执行以下语句:
select orderid, custid, val,
100. * val / sum(val) over() as pctall,
100. * val / sum(val) over(partition by custid) as pctcust
from OrderValues
其结果为:
排序开窗函数
OVER子句也支持四种排序函数:ROW_NUMBER(行号)、RANK(排名)、DENSE_RANK(密集排名)和NTILE。
执行以下语句:
select orderid, custid, val,
row_number() over(order by val) as rownum,
rank() over(order by val) as rank,
dense_rank() over(order by val) as dense_rank,
ntile(6) over(order by val) as ntile
from OrderValues
order by val
其结果如下:
ROW_NUMBER函数用于为结果集中的各行分配递增的序列号,其逻辑顺序由OVER子句中的ORDER BY语句指定。在上面的查询中,逻辑顺序基于val列,随着订单价格的增加,rownum随之增加。
由结果看出,对于val相同的行,其rownum不同。若将orderid为10006和10007在表中的顺序调换,则上述查询结果中,rownum为1的记录的orderid为10008,而10006的r
您可能关注的文档
最近下载
- 大型会议会务工作流程清单(培训讲学版).docx VIP
- 零碳园区水资源循环利用方案.docx
- DB35∕T 836-2015 学生服装标准规范.docx VIP
- 心力衰竭病人的护理(完整版) .pptx VIP
- 明配管支吊架的计算表.xls VIP
- 活动一《塑料制品大点兵》课件 沪科黔科版综合实践活动二年级上册.pptx VIP
- 社区教育考试题及答案.doc VIP
- 污水处理优化软件:SuperPro Designer二次开发_(5).设备与物料流管理.docx VIP
- MSS SP-25中文 国外国际规范.pdf VIP
- 医院信息互联互通标准化成熟度测评方案(2025年版).docx VIP
原创力文档


文档评论(0)