一、窗口函数基本语法:
‹窗口函数› over (partition by ‹用于分组的列名› order by ‹用于排序的列名›)
二、专用窗口函数——rank、dense_rank、row_number
1、基本用法
Select * ,rank() over (partition by <用于分类的列名> order by <用于排序的列名>) as rank from <表名>
注:函数后面的括号不需要任何参数
2、区别
对于 90、90 、90 、80降序排名
Rank:1、1、1、4
Dense_rank :1 、1 、1 、2
Row_number :1 、2、 3、 4
例题(排名问题):查询各科成绩前两名的记录
SELECT * from (
select *,rank() over (partition by 课程号 order by 成绩 )as "rank"
from score
) as s1
where s1.rank < 3
三、聚合窗口函数
Select * ,
sum(成绩) over (order by 学号) as current_sum ,
avg(成绩) over (order by 学号) as current_avg ,
count(成绩) over (order by 学号) as current_count ,
max(成绩) over (order by 学号) as current_max ,
min(成绩) over (order by 学号) as current_min
from class
聚合函数做窗口函数,可以显示截至到本行数据,统计数据的情况,可以看出每一行数据,对整体统计数据的影响
例题(累计求和问题):
按照雇员编号升序排序,查找薪水的累计和。其中累计薪水是前N个当前员工(结束日期=‘9999-01-01’)的薪水的累计和。
select 雇员编号,薪水,
sum(薪水) over (order by 雇员编号) as 累计薪水
from 雇员表
where 结束时间 = '9999-01-01'