1. 程式人生 > >Oracle的分析函數

Oracle的分析函數

一起 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的分析函數