SQL Server中的开窗函数是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server中的开窗函数是啥?相关的知识,希望对你有一定的参考价值。

开窗函数和over是一个东西吗?怎么用?

参考技术A 开窗函数(OVER子句)用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行
中同时返回基础行的列和聚合列。举例来说,如果要得到一个年级所有班级所有学生的平均
分,按照传统的写法,肯定是通过AVG聚合函数来实现求平均分。由于聚合函数是以GROUP BY 查询作为操作的上下文对一组值进行聚合,GROUP BY 操作对数据进行分组后,查询
为每个组只返回一行数据,因此,我们不能同时返回基础列(班级,学生等列),而只能得
到聚合列。
参考技术B http://wenku.baidu.com/link?url=laCRGM1Ns1I2qDE7oyrXCO_ROzBrNxB__VJX-rd3ibMOPx6SPvHIdV_5JXYDUblta_FUEb1IpjLsOENnIdNcJfEOpGAOLAG6VFvnVfw8IEC本回答被提问者采纳

SQL Server聚合函数与聚合开窗函数

以下面这个表的数据作为示例。

什么是聚合函数?

聚合函数:聚合函数就是对一组值进行计算后返回单个值(即分组)。聚合函数在计算时都会忽略空值(null)。

所有的聚合函数均为确定性函数。即任何时候使用一组相同的输入值调用聚合函数执行后的返回值都是相同的,无二义性。

COUNT(统计函数):COUNT函数可以用来返回所有选中行的总行数,它有一个参数,可以是 \'*\'(即所有列)、\'1\'(效果同前者类似)和具体的列名。

     列名前面还可以加上 DISTINCT 关键字(即去掉重复项)。返回值类型为: int

1     select count(1) from Student    -- 返回 9
2 
3     select count(S_Sex) from Student    -- 返回 9
4 
5     select count(distinct S_Sex) from Student    -- 返回 2,即去重之后性别只有两种

COUNT_BIG(统计函数):COUNT_BIG函数的使用方法和COUNT函数相同,只不过返回值为 bigint 数据类型。

注意:count(字段名),如果字段名为NULL,则count函数不会统计。

SUM(求和函数):SUM函数用于求和,计算指定列中所有不为空(null)的总和。返回值类型为: int

1 --求所有学员的身高总和,因为字段类型是 varchar 类型,所以需要转换一下
2     select SUM(convert(int,S_Height)) from Student    -- 返回 1588
3 
4     --求不同身高的学员的身高总和(去掉重复项)
5     select SUM(distinct convert(int,S_Height)) from Student -- 返回 1403

AVG(求平均值函数):AVG函数用于求平均值,计算指定列中所有不为空(null)的平均值。返回值类型为: int

复制代码
1     --求所有学员的平均身高,因为字段类型是 varchar 类型,所以需要转换一下
2     select AVG(convert(int,S_Height)) from Student    -- 返回 176
3 
4     --求不同身高的学员的平均身高(去掉重复项)
5     select AVG(distinct convert(int,S_Height)) from Student -- 返回 175
6 
7     --求男同学的平均身高
8     select AVG(convert(int,S_Height)) from Student where S_Sex=\'男\'    -- 返回 177
复制代码

MAX(最大值函数):MAX函数用于计算最大值,可以使用于numeric、char、varchar、money、smallmoney、或datetime列,但不能用于bit列。返回值类型为: int

1     --求所有学员的最大身高,因为字段类型是 varchar 类型,所以需要转换一下
2     select MAX(convert(int,S_Height)) from Student    -- 返回 190
3 
4     --求女同学的最大身高
5     select MAX(convert(int,S_Height)) from Student where S_Sex=\'女\'    -- 返回 183

MIN(最小值函数):MIN函数用于计算最小值,可以使用于numeric、char、varchar、money、smallmoney、或datetime列,但不能用于bit列。返回值类型为: int

1     --求所有学员的最小身高,因为字段类型是 varchar 类型,所以需要转换一下
2     select MIN(convert(int,S_Height)) from Student    -- 返回 155
3 
4     --求女同学的最小身高
5     select MIN(convert(int,S_Height)) from Student where S_Sex=\'女\'    -- 返回 165

STDEV(标准偏差值函数):STDEV函数用于计算标准偏差值,即每一个数值与平均值的标准差。返回值类型为:float

1     --求所有学员的身高标准差,因为字段类型是 varchar 类型,所以需要转换一下
2     select STDEV(convert(int,S_Height)) from Student    -- 返回 11.2928197443234
3 
4     --求女同学的身高标准差
5     select STDEV(convert(int,S_Height)) from Student where S_Sex=\'女\'    -- 返回 7.88986691902975

VAR(方差值函数):VAR函数用于计算方差值。返回值类型为:float

1     --求所有学员的身高方差,因为字段类型是 varchar 类型,所以需要转换一下
2     select VAR(convert(int,S_Height)) from Student    -- 返回 127.527777777781
3 
4     --求女同学的身高方差
5     select VAR(convert(int,S_Height)) from Student where S_Sex=\'女\'    -- 返回 62.25

HAVING:HAVING子句仅用于带有 GROUP BY 子句的查询语句中,WHERE子句用于每一行数据的筛选(在变成一个组的某一部分之前),而HAVING子句用于分组的聚合值的筛选。

1 --查询身高至少有一个相同的值
2     select S_Height,count(S_Height) 
3     from Student
4     group by S_Height
5     having count(1)>1

 

聚合开窗函数:

聚合函数加上 over() 开窗函数就是聚合开窗函数。

下面看两个示例:

1   select S_StuNo,S_Name,S_Height,
2     sum(convert(int,S_Height)) over(order by S_Height) 
3     from Student

以上是未使用 partition by 指定分区的,可以看出,聚合列的值,第一行的值,为当前行,第二行的值为前面的所有行和当前行的值,以此类推。

1   select S_StuNo,S_Name,S_Height,
2     sum(convert(int,S_Height)) over(partition by S_Height order by S_Height) 
3     from Student

以上是使用 partition by 指定分区的,所以会先分区,再聚合,因为 S_Height 这一列只有两条数据的值是相同的,所以这两条数据为一个分区,其他全部一条数据一个分区,所以只有相同值的两条数据的值为聚合值。

 

1     select S_StuNo,S_Name,S_Height,
2     count(S_Height) over(order by S_Height) 
3     from Student

可以看到上面的数据是没有 7 的,而是直接是 6 跳到 8,我猜可能是因为字段的值相同的存在2条。

1     select S_StuNo,S_Name,S_Height,
2     count(S_Height) over(partition by S_Height order by S_Height) 
3     from Student

因为学号为 012 和 013 的 S_Height 值相同,存在一个分区,所以是2条,其他都是一个分区一条数据。

 

1   select S_StuNo,S_Name,S_Height,
2     AVG(convert(int,S_Height)) over(order by S_Height) 
3     from Student

以上未使用 partition by 子句指定分区,可以看出第一条数据为当前行的平均值,第二条数据为前面所有行和当前行的平均值,以此类推。

1   select S_StuNo,S_Name,S_Height,
2     AVG(convert(int,S_Height)) over(partition by S_Height order by S_Height) 
3     from Student

以上使用 partition by 子句指定了分区,所以是在每个分区进行计算平均值。

 

其它聚合开窗函数使用方法类似,就不记了。

以上是关于SQL Server中的开窗函数是啥?的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER开窗函数

SQL Server 2012 - 开窗函数

能说一下oracle中的开窗函数 聚合函数 分析函数都是啥吗?

SQL SERVER 开窗函数

开窗函数是啥?

SQL Server排名函数与排名开窗函数