经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
sql函数:开窗函数简介
来源:cnblogs  作者:万年以后  时间:2019/4/8 12:39:34  对本文有异议

与聚合函数一样,开窗函数也是对行集组进行聚合计算,但是普通聚合函数每组只能返回一个值,而开窗函数可以每组返回多个值。

实验一
比如我们想查询每个工资小于5000元的员工信息(城市以及年龄),并且在每行中都显示所有工资小于5000元的员工个数,执行下面的SQL语句

  1. select t.fcity,t.fage,count(*) from person t where t.fsalary<5000

这个语句显然是错误的,因为count()是聚合函数,然后fname和fage字段没有包含分组里面。

 

实验二
那么,这样写呢?

  1. select t.fcity,t.fage,count(*) from person t where t.fsalary<5000 group by t.fcity,t.fage

查询结果

 


这与我们每行中都显示所有工资小于5000元的员工个数这个条件是不符合的,那么应该怎么写呢?

实验三

  1. select t.fcity,
  2. t.fage,
  3. (select count(*) from person f where f.fsalary < 5000)
  4. from person t
  5. where t.fsalary < 5000

查询结果:

 

 


这次的查询结果和我们想要的结果一样了,但是这样写多了一个子查询,非常麻烦。使用开窗函数可以大大简化实现,下面看一下开窗函数要实现这个效果怎么写

实验四

  1. select t.fcity, t.fage, count(*) over()
  2. from person t
  3. where t.fsalary < 5000

看下执行效果:

 


可以看到这个SQL语句与我们第一个实验不同的是我们在count(*)后面加了一个over关键字。

开窗函数的调用格式为:

         函数名(列)over(选项)

over关键字表示把函数当成开窗函数而不是聚合函数,SQL标准允许将所有聚合函数用做开窗函数,使用over关键字来区分这两种用法。

在上面的例子中,开窗函数count(*) over()对于查询结果的每一行都返回所有符合条件的行的条数,over关键字后的括号中还经常添加选项用以改变进行聚合运算的窗口范围(后面博客会持续更新),如果over关键字后的括号中选项为空,则开窗函数会对结果集中的所有行进行聚合运算。当然,不只是count(*) over,max(fage) over(),min(fage) over()都可以。

原文链接:http://www.cnblogs.com/tyyking/p/10665027.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号