Oracle高级查询之OVER (PARTITION BY ..)
一、rank()/dense_rank() over(partition by ...order by ...)
查詢每個部門工資最高的雇員的信息:
1. select e.ename, e.job, e.sal, e.deptno?
? from scott.emp e,?
?????? (select e.deptno, max(e.sal) sal from scott.emp e group by e.deptno) me?
?where e.deptno = me.deptno?
?? and e.sal = me.sal;?
?2. 使用 rank() over(partition by...)或dense_rank() over(partition by...)語法
select e.ename, e.job, e.sal, e.deptno?
? from (select e.ename,?
?????????????? e.job,?
?????????????? e.sal,?
?????????????? e.deptno,?
?????????????? rank() over(partition by e.deptno order by e.sal desc) rank?
????????? from scott.emp e) e?
?where e.rank = 1;
?select e.ename, e.job, e.sal, e.deptno?
? from (select e.ename,?
?????????????? e.job,?
?????????????? e.sal,?
?????????????? e.deptno,?
?????????????? dense_rank() over(partition by e.deptno order by e.sal desc) rank?
????????? from scott.emp e) e?
?where e.rank = 1;?
這里補充講解一下rank()/dense_rank() over(partition by e.deptno order by e.sal desc)語法。
over:? 在什么條件之上。
partition by e.deptno:? 按部門編號劃分(分區)。
order by e.sal desc:? 按工資從高到低排序(使用rank()/dense_rank() 時,必須要帶order by否則非法)
rank()/dense_rank():? 分級
整個語句的意思就是:在按部門劃分的基礎上,按工資從高到低對雇員進行分級,“級別”由從小到大的數字表示(最小值一定為1)。?
那么rank()和dense_rank()有什么區別呢?
rank():? 跳躍排序,如果有兩個第一級時,接下來就是第三級。
dense_rank():? 連續排序,如果有兩個第一級時,接下來仍然是第二級。
下面再列舉一些常用的方法在該語法中的應用(注:帶order by子句的方法說明在使用該方法的時候必須要帶order by):
select e.ename,?
?????? e.job,?
?????? e.sal,?
?????? e.deptno,?
?????? first_value(e.sal) over(partition by e.deptno) first_sal,?
?????? last_value(e.sal) over(partition by e.deptno) last_sal,?
?????? sum(e.sal) over(partition by e.deptno) sum_sal,?
?????? avg(e.sal) over(partition by e.deptno) avg_sal,?
?????? count(e.sal) over(partition by e.deptno) count_num,?
?????? row_number() over(partition by e.deptno order by e.sal) row_num?
? from scott.emp e;?
?
?
轉載于:https://www.cnblogs.com/changxr/p/5105972.html
總結
以上是生活随笔為你收集整理的Oracle高级查询之OVER (PARTITION BY ..)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 说说Java的内存
- 下一篇: 根据鼠标点击位置获取DataGridVi