设为首页 收藏本站
查看: 1723|回复: 0

[经验分享] SQL Server聚合函数与聚合开窗函数

[复制链接]

尚未签到

发表于 2017-12-14 13:34:24 | 显示全部楼层 |阅读模式
  以下面这个表的数据作为示例。
DSC0000.png

  什么是聚合函数?
  聚合函数:聚合函数就是对一组值进行计算后返回单个值(即分组)。聚合函数在计算时都会忽略空值(null)。
  所有的聚合函数均为确定性函数。即任何时候使用一组相同的输入值调用聚合函数执行后的返回值都是相同的,无二义性。
  COUNT(统计函数):COUNT函数可以用来返回所有选中行的总行数,它有一个参数,可以是 '*'(即所有列)、'1'(效果同前者类似)和具体的列名。
  列名前面还可以加上 DISTINCT 关键字(即去掉重复项)。返回值类型为: int
  

     select count(1) from Student  

  
     select count(S_Sex) from Student   
  

  
     select count(distinct S_Sex) from Student   
  

  COUNT_BIG(统计函数):COUNT_BIG函数的使用方法和COUNT函数相同,只不过返回值为 bigint 数据类型。
  注意:count(字段名),如果字段名为NULL,则count函数不会统计。
  SUM(求和函数):SUM函数用于求和,计算指定列中所有不为空(null)的总和。返回值类型为: int
  

  
     select SUM(convert(int,S_Height)) from Student   
  

  
     
  
     select SUM(distinct convert(int,S_Height)) from Student
  

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

  
     select AVG(convert(int,S_Height)) from Student   
  

  
     
  
     select AVG(distinct convert(int,S_Height)) from Student
  

  
     
  
     select AVG(convert(int,S_Height)) from Student where S_Sex='男'   
  

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

  
     select MAX(convert(int,S_Height)) from Student   
  

  
     
  
     select MAX(convert(int,S_Height)) from Student where S_Sex='女'   
  

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

  
     select MIN(convert(int,S_Height)) from Student   
  

  
     
  
     select MIN(convert(int,S_Height)) from Student where S_Sex='女'   
  

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

  
     select STDEV(convert(int,S_Height)) from Student   
  

  
     
  
     select STDEV(convert(int,S_Height)) from Student where S_Sex='女'   
  

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

  
     select VAR(convert(int,S_Height)) from Student   
  

  
     
  
     select VAR(convert(int,S_Height)) from Student where S_Sex='女'   
  

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

  
     select S_Height,count(S_Height)
  
     from Student
  
     group by S_Height
  
     having count(1)>1
  

  聚合开窗函数:
  聚合函数加上 over() 开窗函数就是聚合开窗函数。
  下面看两个示例:
  

  select S_StuNo,S_Name,S_Height,  

     sum(convert(int,S_Height)) over(order by S_Height)  

     from Student  

DSC0001.png

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

  select S_StuNo,S_Name,S_Height,  

     sum(convert(int,S_Height)) over(partition by S_Height order by S_Height)  

     from Student  

DSC0002.png

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

     select S_StuNo,S_Name,S_Height,  

     count(S_Height) over(order by S_Height)  

     from Student  

DSC0003.png

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

     select S_StuNo,S_Name,S_Height,  

     count(S_Height) over(partition by S_Height order by S_Height)  

     from Student  

DSC0004.png

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

  select S_StuNo,S_Name,S_Height,  

     AVG(convert(int,S_Height)) over(order by S_Height)  

     from Student  

DSC0005.png

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

  select S_StuNo,S_Name,S_Height,  

     AVG(convert(int,S_Height)) over(partition by S_Height order by S_Height)  

     from Student  

DSC0006.png

  以上使用 partition by 子句指定了分区,所以是在每个分区进行计算平均值。
  其它聚合开窗函数使用方法类似,就不记了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-424015-1-1.html 上篇帖子: Sql Server 收缩日志文件原理及always on 下的实践 下篇帖子: SQL Server操作结果集-并集 差集 交集 结果集排序
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表