SQLServer三种开窗函数详细用法
一,开窗函数的语法
开窗函数的语法为:over(partition by 列名1 order by 列名2 ),括号中的两个关键词partition by 和order by 可以只出现一个。over() 前面是一个函数,如果是聚合函数,那么order by 不能一起使用。
二,从聚合开窗函数sum(score) over(partition by name )讲起
实不相瞒我看一眼就会了(假的,其实这种又臭又长的字实在懒得看)
sum(score) over(partition by name )
sum()是聚合函数,其实我聚合函数还没学明白,当 sum()函数 后面跟上 over()以后,由sum聚合函数就成为了开窗函数。
over() 括号里面就是定义窗口的内容了,partition 是分区,分组的意思。partition by 就是根据某个字段分组。
所以sum(score) over(partition by name ) ,就是先根据 name 分组(如图),当前面加了sum(score)后就把根据name分组后的,每个(组)窗口里面的字段 score进行求和操作。
select *,sum(score) over(partition by name) sum窗口函数举例 from kchs -- 为了简单就只有两个字段,name和score

聚合函数同样需要对数据进行排序,但不会显示排名结果。会将当前名次的数据 与 排在这之前的所有数据 依次做相应的计算。
执行语句:
select *, sum(score) over (order by id) as 累加求和 from kchs

拓展一下:
一,很多聚合函数都可以用作窗口函数的运算,如SUM、AVG、MAX、MIN、COUNT。
二,和gropu by 不同的是窗口函数会生成多行,而不是想group by 一样只有一行
三,开窗函数之first_value,last_value,lead,lag
first_value:是在窗口里面取到第一个值
first_value(score) over( partition by name)as first_score , 根据name分区(组),取score列的第一个值
last_value:是在窗口里面取到最后一个值
last_value(score) over(partition by name) as last_score --根据name分区(组),取score列的最后一个值
lead 是取当前行的上 N 条数据,并且可以设置默认值
lead(score,1,0) over(partition by name ) as lead_score --根据name分区(组),score列当前行的上面N行,,如果没有就为默认值0
lag 是取当前行的下 N 条数据,并且可以设置默认值
lag(score,1,0) over(partition by name ) as lag_score --根据name分区(组),score列当前行的下面N行,如果没有就为默认值0

四,排名开窗函数ROW_NUMBER、DENSE_RANK、RANK
row_number ()是为每组的行设置一个连续的递增的数字(123456)
ROW_NUMBER() over( partition by name order by score asc)as ROW_NUMBER_score
rank()是排名,也为每一组的行生成一个序号,如果有相同的值会生成相同的序号,并且接下来的序号是不连序的。例如:有三个人并列第一名,第四名序号为四(111456)
rank() over(partition by name order by score asc) as RANK_score
DENSE_RANK()和RANK()类似,不同的是如果有相同的序号,那么接下来的序号不会间断。例如:有三个人并列第一,第四名序号为2(111234)
DENSE_RANK() over(partition by name order by score asc) as DENSE_RANK_score

注意:
一,排名开窗函数可以单独使用ORDER BY 语句,也可以和PARTITION BY同时使用。
二,ORDER BY 指定排名开窗函数的顺序,在排名开窗函数中必须使用ORDER BY语句。
三,PARTITION BY用于将结果集进行分组,开窗函数应用于每一组。
到此这篇关于SQLServer三种开窗函数详细用法的文章就介绍到这了,更多相关SQLServer 开窗函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
sqlserver中比较一个字符串中是否含含另一个字符串中的一个字符
sql中比较一个字符串中是否含有另一个字符串中的一个字符的实现代码,需要的朋友可以参考下。2010-09-09
sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期
CTE是在内存中准备好数据,而不是每次一条往返服务器和客户端一次。如果需要再插入到临时表的话就是全部数据一次性插入。 这篇文章主要介绍了sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期 ,需要的朋友可以参考下2019-07-07
SQLServer中bigint转int带符号时报错问题解决方法
用一个函数来解决SQLServer中bigint转int带符号时报错问题,经测试可用,有类似问题的朋友可以参考下2014-09-09
完美解决MSSQL"以前的某个程序安装已在安装计算机上创建挂起的文件操作"
以前装过sql server,后来删掉。现在重装,却出现“以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机”错误。无法进行下去。 现在又遇到了,终于完全搞定.2008-11-11
SQL SERVER2012中新增函数之字符串函数CONCAT详解
SQL Server 2012有一个新函数,就是CONCAT函数,连接字符串非它莫属。比如在它出现之前,连接字符串是使用"+"来连接,如遇上NULL,还得设置参数与配置,不然连接出来的结果将会是一个NULL。本文就介绍了关于SQL SERVER 2012中CONCAT函数的相关资料,需要的朋友可以参考。2017-03-03
SQL Server中参数化SQL写法遇到parameter sniff ,导致不合理执行计划重用的快速解决方法
这篇文章主要介绍了SQL Server中参数化SQL写法遇到parameter sniff ,导致不合理执行计划重用的快速解决方法的相关资料,需要的朋友可以参考下2016-07-07


最新评论