必须知道的Oracle五个常用开窗函数
示例1:使用ROWNUMBER()开窗函数
查询员工表中每个部门中前三名工资最高的员工信息SELECTDEPARTMENTNAME,LASTNAME,SALARY,rownumber()OVER(PARTITIONBYDEPARTMENTNAMEORDERBYSALARYDESC)ASRANKFROMEMPLOYEEST1,DEPARTMENTST2WHERET1。DEPARTMENTIDT2。DEPARTMENTIDANDT2。DEPARTMENTNAMEIT;
DEPARTMENTNAME
LASTNAME
SALARY
RANK
IT
Hunold
9000。00
1hrIT
Ernst
6000。00
2hrIT
Austin
4800。00
3hrIT
Pataballa
4800。00
4hrIT
Lorentz
4200。00
5hr示例2:使用RANK()开窗函数
查询员工表中每个部门中工资排名前三的员工信息SELECTDEPARTMENTNAME,LASTNAME,SALARY,RANK()OVER(PARTITIONBYDEPARTMENTNAMEORDERBYSALARYDESC)ASRANKFROMEMPLOYEEST1,DEPARTMENTST2WHERET1。DEPARTMENTIDT2。DEPARTMENTIDANDT2。DEPARTMENTNAMEIT;
DEPARTMENTNAME
LASTNAME
SALARY
RANK
IT
Hunold
9000。00
1hrIT
Ernst
6000。00
2hrIT
Austin
4800。00
3hrIT
Pataballa
4800。00
3hrIT
Lorentz
4200。00
5hr示例3:使用DENSERANK()开窗函数
查询员工表中每个部门中工资相同的员工排名相同,排名前三的员工信息SELECTDEPARTMENTNAME,LASTNAME,SALARY,DENSERANK()OVER(PARTITIONBYDEPARTMENTNAMEORDERBYSALARYDESC)ASRANKFROMEMPLOYEEST1,DEPARTMENTST2WHERET1。DEPARTMENTIDT2。DEPARTMENTIDANDT2。DEPARTMENTNAMEIT;
DEPARTMENTNAME
LASTNAME
SALARY
RANK
IT
Hunold
9000。00
1hrIT
Ernst
6000。00
2hrIT
Austin
4800。00
3hrIT
Pataballa
4800。00
3hrIT
Lorentz
4200。00
4hr示例4:使用NTILE()开窗函数
查询员工表中每个部门中工资分成四组的信息SELECTDEPARTMENTNAME,LASTNAME,SALARY,NTILE(4)OVER(PARTITIONBYDEPARTMENTNAMEORDERBYSALARYDESC)ASGROUPNUMFROMEMPLOYEEST1,DEPARTMENTST2WHERET1。DEPARTMENTIDT2。DEPARTMENTIDANDT2。DEPARTMENTNAMEIT;
DEPARTMENTNAME
LASTNAME
SALARY
GROUPNUM
IT
Hunold
9000。00
1hrIT
Ernst
6000。00
1hrIT
Austin
4800。00
2hrIT
Pataballa
4800。00
3hrIT
Lorentz
4200。00
4hr示例5:使用LAG()开窗函数
查询员工表中每个部门中每个员工的工资和上一个员工工资的差SELECTDEPARTMENTNAME,LASTNAME,SALARY,LAG(SALARY,1)OVER(PARTITIONBYDEPARTMENTNAMEORDERBYLASTNAME)ASPREVSALARY,SALARYLAG(SALARY,1)OVER(PARTITIONBYDEPARTMENTNAMEORDERBYLASTNAME)ASDIFFFROMEMPLOYEEST1,DEPARTMENTST2WHERET1。DEPARTMENTIDT2。DEPARTMENTIDANDT2。DEPARTMENTNAMEIT;
DEPARTMENTNAME
LASTNAME
SALARY
PREVSALARY
DIFF
IT
Austin
4800。00
null
null
IT
Ernst
6000。00
4800hr1200hrIT
Hunold
9000。00
6000hr3000hrIT
Lorentz
4200。00
9000hr4800
IT
Pataballa
4800。00
4200hr600