SQL Server开窗函数实例.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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

文档评论(0)

_______ + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档