开窗函数
与聚合函数一样,开窗函数也是对行集组进行聚合计算,但是普通聚合函数每组只能返回一个值,而开窗函数可以每组返回多个值。
实验一
比如我们想查询每个工资小于5000元的员工信息(城市以及年龄),并且在每行中都显示所有工资小于5000元的员工个数,执行下面的sql语句
select t.fcity,t.fage,count(*) from person t where t.fsalary<5000
这个语句显然是错误的,因为count()是聚合函数,然后fname和fage字段没有包含分组里面。
实验二
那么,这样写呢?
select t.fcity,t.fage,count(*) from person t where t.fsalary<5000 group by t.fcity,t.fage
查询结果
这与我们每行中都显示所有工资小于5000元的员工个数这个条件是不符合的,那么应该怎么写呢?
实验三
-
select t.fcity,
-
t.fage,
-
(select count(*) from person f where f.fsalary < 5000)
-
from person t
-
where t.fsalary < 5000
查询结果:
这次的查询结果和我们想要的结果一样了,但是这样写多了一个子查询,非常麻烦。使用开窗函数可以大大简化实现,下面看一下开窗函数要实现这个效果怎么写
实验四
-
select t.fcity, t.fage, count(*) over()
-
from person t
-
where t.fsalary < 5000
看下执行效果:
可以看到这个SQL语句与我们第一个实验不同的是我们在count(*)后面加了一个over关键字。
开窗函数的调用格式为:
函数名(列)over(选项)
over关键字表示把函数当成开窗函数而不是聚合函数,SQL标准允许将所有聚合函数用做开窗函数,使用over关键字来区分这两种用法。
在上面的例子中,开窗函数count(*) over()对于查询结果的每一行都返回所有符合条件的行的条数,over关键字后的括号中还经常添加选项用以改变进行聚合运算的窗口范围(后面博客会持续更新),如果over关键字后的括号中选项为空,则开窗函数会对结果集中的所有行进行聚合运算。当然,不只是count(*) over,max(fage) over(),min(fage) over()都可以。
原文参考:https://blog.csdn.net/mascf/article/details/50533922
相关阅读
如果客户端有连接请求,必须使用下述函数来接受客户端的请求。SOCKET accept( SOCKET s, struct
相信学习c++的很多同志都听过这样的建议:最好将类的析构函数写成虚函数,如下:class B { public: B() { printf("B()\n"); }
sql 四大排名函数---(ROW_NUMBER、RANK、DENSE_RANK、N
1.ROW_NUMBER() 定义:ROW_NUMBER()函数作用就是将select查询到的数据进行排序,每一条数据加一个序号,他不能用做于学生成绩的排名,一
1、fftshift fftshift(M),是作用是将,M矩阵的左右对换,上下对换..2、filter2(B,X) B为滤波器.X为要滤波的数据,这里将B放在X上,一
C#中Console.WriteLine()函数输出格式详解
格式项都采用如下形式: {index[,alignment][:formatString]} 其中"index"指索引占位符,这个肯定都知道; ",alignment"按字面意思显