一、oracle分析函式的語法與作用:
rank ( ) over ( [query_partition_clause]order_by_clause )
dense_rank ( ) over ([query_partition_clause] order_by_clause )
rownumber ( ) over ( [query_partition_clause]order_by_clause )
可實現按指定的字段分組排序,對於相同分組欄位的結果集進行排序,其中partition by 為分組字段,order by 指定排序字段
over不能單獨使用,要和分析函式:rank(),dense_rank(),row_number()等一起使用
二、oracle分析函式與聚合函式的區別:
分析函式用於計算基於組的某種聚合值,它和聚合函式的不同之處是對於每個組返回多行,而聚合函式對於每個組只返回一行。
三、例子:
許多分析函式同時也是聚合函式,比如sum()函式,這樣使用就是聚合函式。
sql> select deptno,sum(sal) sum_sal fromemp group by deptno;
而這樣使用就是分析函式。
sql> select distinct deptno,sum(sal)over(partition by deptno) sum_sal from emp;
它們得出的結果是相同的,都是:
1 10 8750
2 20 10875
3 30 9400
請注意,這裡我們用到了distinct 關鍵字,如果不用distinct,第2個查詢將返回14行資料,即emp表的每行記錄都將返回一行sum_sal,因為不用distinct的含義是:針對每個雇員計算他/她所在的部門的薪金總數。
sql> select deptno,sum(sal) over(partition by deptno) sum_sal from emp
1 10 8750
2 10 8750
3 10 8750
4 20 10875
5 20 10875
6 20 10875
7 20 10875
8 20 10875
9 30 9400
10 30 9400
11 30 9400
12 30 9400
13 30 9400
14 30 9400
在這個例子中,聚合函式是更好的選擇,但在另外一些情形下,我們更應該使用分析函式。
下面通過幾個例項來介紹部分分析函式的用途。
問題1:求出每個部門工資最高的前3名。
利用我們傳統的聚合函式max可以方便地取出工資最高的乙個員工,但是取出多個就無能為力了,同樣,如果不分組我們可以通過排序取出工資最高的前3名,但無法實現對多個部門的分組。而採用rank聚合函式,可以方便地實現我們的要求。
完整的語句如下:
select * from (
select deptno,sal,ename, rank()over(partition by deptno order by sal desc) pm from emp)
where pm<=3
結果為:
1 10 king 5000.00 1
2 10 clark 2450.00 2
3 10 miller 1300.00 3
4 20 scott 3000.00 1
5 20 ford 3000.00 1
6 20 jones 2975.00 3
7 30 blake 2850.00 1
8 30 allen 1600.00 2
9 30 turner 1500.00 3
我們在開窗函式中使用deptno(部門編號)作為分組標誌,並按照sal(工資)倒序排列。
注意:rank()函式有3組,分別是rank, dense_rank, row_number,它們的區別是:
rank如果出現兩個相同的資料,那麼後面的資料就會直接跳過這個排名,比如:當第2名和第3名的利潤相同時,rank的結果是1,2,2,4;而dense_rank則不會跳過這個排名,結果是1,2,2,3;而row_number哪怕是兩個資料完全相同,排名也會不一樣,結果是1,2,3,4
dense_rank()
完整的語句如下:
select * from (selectdeptno,ename,sal,dense_rank() over(partition by deptno order by sal desc) pmfrom emp) t where pm<=3
//按部門編號根據工資由高到低排序
結果:1 10 king 5000.00 1
2 10 clark 2450.00 2
3 10 miller 1300.00 3
4 20 scott 3000.00 1
5 20 ford 3000.00 1
6 20 jones 2975.00 2
7 20 adams 1100.00 3
8 30 blake 2850.00 1
9 30 allen 1600.00 2
10 30 turner 1500.00 3
rank()
完整的語句如下:
select * from (selectdeptno,ename,sal,rank() over(partition by deptno order by sal desc) pm fromemp) t where pm<=3
//按部門編號根據工資由高到低排序
結果:1 10 king 5000.00 1
2 10 clark 2450.00 2
3 10 miller 1300.00 3
4 20 scott 3000.00 1
5 20 ford 3000.00 1
6 20 jones 2975.00 3
7 30 blake 2850.00 1
8 30 allen 1600.00 2
9 30 turner 1500.00 3
row_number()
完整的語句如下:
select * from (selectdeptno,ename,sal,row_number() over(partition by deptno order by sal desc) pmfrom emp) t where pm<=3
//按部門編號根據工資由高到底排序
結果:1 10 king 5000.00 1
2 10 clark 2450.00 2
3 10 miller 1300.00 3
4 20 scott 3000.00 1
5 20 ford 3000.00 2
6 20 jones 2975.00 3
7 30 blake 2850.00 1
8 30 allen 1600.00 2
9 30 turner 1500.00 3
Oracle 分析函式與聚合函式(重點理解)
一 oracle分析函式的語法與作用 rank over query partition clause order by clause dense rank over query partition clause order by clause rownumber over query partit...
oracle聚合函式彙總
今天在做專案,講mysql專案轉換為oracle專案的時候,發現某些sql語句不相容 mysql語句如下 select column1,group concat shouyilv order by crete date as shouyilv from rconfigdata where colum...
SQL 聚合函式 非聚合函式
聚合函式 聚合函式就是對一組值進行計算後返回單個值 即分組 聚合函式在計算時都會忽略空值 null 所有的聚合函式均為確定性函式。即任何時候使用一組相同的輸入值呼叫聚合函式執行後的返回值都是相同的,無二義性。2 聚合開窗函式 聚合函式加上 over 開窗函式就是聚合開窗函式。create table...