在实现一些复杂的sql需求时,开窗函数能够较为直接地完成功能。
over的格式如下:
function col_name over (partition by cl_name order by col_name)
over(partition by xxx) 按xxx分组的所有行进行分组
over(partition by xxx order by aaa) 按xxx分组,按列aaa排序
over前可以加聚合函数 例如sum count avg min max等
over前也可以加 first_value last_value等 windows 子句 用来制定累加的方式
rank() over等的用法
到这,肯定会想到gruop by,那么over(partition by)和group by有什么区别呢?
group by 只能得到分组后的统计数据,
over partition by 不仅可以得到分组后的统计数据,还可以同时显示明细数据。
group by 是在where子句之后;over partition by 是from子句之前。
(然后我在我的云主机上的my sql里试了几次。。。。一直提示有语法错误。。。百度了才知道!mysql里并没有over()!)
下面来个小栗子:
有如下这么一张表
name dept salary
A 10 1000
B 10 2000
C 20 1500
D 20 3000
E 10 1000
查询每位员工本来的具体信息和它所在部门的总工资:
select name,dept,salary,sum(salary)
over (partition by dept) total_salary
from salary;
结果:
name dept salary tatal_salary
A 10 1000 4000
B 10 2000 4000
E 10 1000 4000
C 20 1500 4500
D 20 3000 4500
由此可见,over(parition)是为了分组操作,而且能够返回分组之后的明细数据。
那有没有办法在mysql中实现类似的功能呢?
我在我之前的一个表上进行了尝试。
我们需要对如上的表中,按老师对学生进行分组:
与聚合函数配合使用,并且加上id字段:
这已经比较接近over(partition by)了
那如何才能让它像over(partition by)那样一行一行的显示呢?
这个还不会。。。。