SQL-开窗函数over()

一,前言

在实现一些复杂的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中实现类似的功能呢?

我在我之前的一个表上进行了尝试。

SQL-开窗函数over()_第1张图片

我们需要对如上的表中,按老师对学生进行分组:

SQL-开窗函数over()_第2张图片

与聚合函数配合使用,并且加上id字段:

SQL-开窗函数over()_第3张图片

这已经比较接近over(partition by)了

那如何才能让它像over(partition by)那样一行一行的显示呢?

这个还不会。。。。

你可能感兴趣的:(SQL-开窗函数over())