Oracle的分析函數
阿新 • • 發佈:2018-07-04
一起 esc 不同 mil 用法 oracl 使用 idt 順序
Oracle的分析函數row_number(),rank(),dense_rank()的用法與區別
比如查詢工資排名第7的員工信息,可以用分析函數來做。
--查詢工資排名第7的員工信息
select *
from (select emp.*, rank() over(order by sal desc) rank from emp)
where rank = 7;
select *
from (select emp.*, dense_rank() over(order by sal desc) dr from emp)
where dr = 7;
select *
from (select emp.*, row_number() over(order by sal desc) rn from emp)
where rn = 7;
但他們的用法還是有區別的,這3個函數的唯一區別在於當碰到相同數據時的排名策略。
①ROW_NUMBER:
Row_number函數返回一個唯一的值,當碰到相同數據時,排名按照記錄集中記錄的順序依次遞增。
②DENSE_RANK:
Dense_rank函數返回一個唯一的值,除非當碰到相同數據時,此時所有相同數據的排名都是一樣的。
③RANK:
Rank函數返回一個唯一的值,除非遇到相同的數據時,此時所有相同數據的排名是一樣的,同時會在最後一條相同記錄和下一條不同記錄的排名之間空出排名。
依次貼圖說明:
從圖中可以看出,rownum遇到的數據無論是否相同,都按照順序排序;dense_rank當遇到相同數據時,相同數據的排名是相同的,但會空出相應的排名;rank遇到相同的數據時,相同的數據排名相同,且不會空出相應的排名。
over()函數不能單獨使用,必須和分析函數或者聚合函數一起使用
例如員工表中分部門進行排序
select ename, deptno, dense_rank() over(partition by deptno order by sal) dr from emp;
over函數和sum函數一起使用可以實現連續求和
select ename, deptno, sal, sum(sal) over(partition by deptno order by ename) part_sum from emp;
over()函數是一個窗口說明函數,用來說明前面所接函數的限制條件,如果over函數中無條件,則求的是所有員工的工資總和
select ename, deptno, sal, sum(sal) over() from emp;
Oracle的分析函數