Oracle 分析函數(shù)RANK(),ROW_NUMBER(),LAG()等的使用方法
更新時間:2009年11月04日 23:37:49 作者:
Oracle分析函數(shù)RANK(),ROW_NUMBER(),LAG()等的使用方法,需要的朋友可以參考下。
ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2)
表示根據(jù)COL1分組,在分組內部根據(jù) COL2排序
而這個值就表示每組內部排序后的順序編號(組內連續(xù)的唯一的)
RANK() 類似,不過RANK 排序的時候跟派名次一樣,可以并列2個第一名之后 是第3名
LAG 表示 分組排序后 ,組內后面一條記錄減前面一條記錄的差,第一條可返回 NULL
BTW: EXPERT ONE ON ONE 上講的最詳細,還有很多相關特性,文檔看起來比較費勁
row_number()和rownum差不多,功能更強一點(可以在各個分組內從1開時排序)
rank()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內)
dense_rank()l是連續(xù)排序,有兩個第二名時仍然跟著第三名。
相比之下row_number是沒有重復值的
lag(arg1,arg2,arg3):
arg1是從其他行返回的表達式
arg2是希望檢索的當前行分區(qū)的偏移量。是一個正的偏移量,時一個往回檢索以前的行的數(shù)目。
arg3是在arg2表示的數(shù)目超出了分組的范圍時返回的值。
SQL> set pagesize 100;
SQL> select rownum from emp;
ROWNUM
----------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
已選擇14行。
已用時間: 00: 00: 00.10
SQL> select deptno,row_number() over(partition by deptno order by sal) from emp order by deptno;
DEPTNO ROW_NUMBER()OVER(PARTITIONBYDEPTNOORDERBYSAL)
---------- ---------------------------------------------
10 1
2
3
20 1
2
3
4
5
30 1
2
3
4
5
6
已選擇14行。
已用時間: 00: 00: 00.41
SQL> select deptno,rank() over (partition by deptno order by sal) from emp order by deptno;
DEPTNO RANK()OVER(PARTITIONBYDEPTNOORDERBYSAL)
---------- ---------------------------------------
10 1
2
3
20 1
2
3
4
4
30 1
2
2
4
5
6
已選擇14行。
已用時間: 00: 00: 00.21
SQL> select deptno,dense_rank() over(partition by deptno order by sal) from emp order by deptno;
DEPTNO DENSE_RANK()OVER(PARTITIONBYDEPTNOORDERBYSAL)
---------- ---------------------------------------------
10 1
2
3
20 1
2
3
4
4
30 1
2
2
3
4
5
已選擇14行。
已用時間: 00: 00: 00.20
SQL> select deptno,ename,sal,lag(ename,1,null) over(partition by deptno order by ename) from emp ord
er by deptno;
DEPTNO ENAME SAL LAG(ENAME,
---------- ---------- ---------- ----------
10 CLARK 2450
KING 5000 CLARK
MILLER 1300 KING
20 ADAMS 1100
FORD 3000 ADAMS
JONES 2975 FORD
SCOTT 3000 JONES
SMITH 800 SCOTT
30 ALLEN 1600
BLAKE 2850 ALLEN
JAMES 950 BLAKE
MARTIN 1250 JAMES
TURNER 1500 MARTIN
WARD 1250 TURNER
已選擇14行。
已用時間: 00: 00: 00.31
SQL> select deptno,ename,sal,lag(ename,2,'example') over(partition by deptno order by ename) from em
p order by deptno;
DEPTNO ENAME SAL LAG(ENAME,
---------- ---------- ---------- ----------
10 CLARK 2450 example
KING 5000 example
MILLER 1300 CLARK
20 ADAMS 1100 example
FORD 3000 example
JONES 2975 ADAMS
SCOTT 3000 FORD
SMITH 800 JONES
30 ALLEN 1600 example
BLAKE 2850 example
JAMES 950 ALLEN
MARTIN 1250 BLAKE
TURNER 1500 JAMES
WARD 1250 MARTIN
已選擇14行。
表示根據(jù)COL1分組,在分組內部根據(jù) COL2排序
而這個值就表示每組內部排序后的順序編號(組內連續(xù)的唯一的)
RANK() 類似,不過RANK 排序的時候跟派名次一樣,可以并列2個第一名之后 是第3名
LAG 表示 分組排序后 ,組內后面一條記錄減前面一條記錄的差,第一條可返回 NULL
BTW: EXPERT ONE ON ONE 上講的最詳細,還有很多相關特性,文檔看起來比較費勁
row_number()和rownum差不多,功能更強一點(可以在各個分組內從1開時排序)
rank()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內)
dense_rank()l是連續(xù)排序,有兩個第二名時仍然跟著第三名。
相比之下row_number是沒有重復值的
lag(arg1,arg2,arg3):
arg1是從其他行返回的表達式
arg2是希望檢索的當前行分區(qū)的偏移量。是一個正的偏移量,時一個往回檢索以前的行的數(shù)目。
arg3是在arg2表示的數(shù)目超出了分組的范圍時返回的值。
SQL> set pagesize 100;
SQL> select rownum from emp;
ROWNUM
----------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
已選擇14行。
已用時間: 00: 00: 00.10
SQL> select deptno,row_number() over(partition by deptno order by sal) from emp order by deptno;
DEPTNO ROW_NUMBER()OVER(PARTITIONBYDEPTNOORDERBYSAL)
---------- ---------------------------------------------
10 1
2
3
20 1
2
3
4
5
30 1
2
3
4
5
6
已選擇14行。
已用時間: 00: 00: 00.41
SQL> select deptno,rank() over (partition by deptno order by sal) from emp order by deptno;
DEPTNO RANK()OVER(PARTITIONBYDEPTNOORDERBYSAL)
---------- ---------------------------------------
10 1
2
3
20 1
2
3
4
4
30 1
2
2
4
5
6
已選擇14行。
已用時間: 00: 00: 00.21
SQL> select deptno,dense_rank() over(partition by deptno order by sal) from emp order by deptno;
DEPTNO DENSE_RANK()OVER(PARTITIONBYDEPTNOORDERBYSAL)
---------- ---------------------------------------------
10 1
2
3
20 1
2
3
4
4
30 1
2
2
3
4
5
已選擇14行。
已用時間: 00: 00: 00.20
SQL> select deptno,ename,sal,lag(ename,1,null) over(partition by deptno order by ename) from emp ord
er by deptno;
DEPTNO ENAME SAL LAG(ENAME,
---------- ---------- ---------- ----------
10 CLARK 2450
KING 5000 CLARK
MILLER 1300 KING
20 ADAMS 1100
FORD 3000 ADAMS
JONES 2975 FORD
SCOTT 3000 JONES
SMITH 800 SCOTT
30 ALLEN 1600
BLAKE 2850 ALLEN
JAMES 950 BLAKE
MARTIN 1250 JAMES
TURNER 1500 MARTIN
WARD 1250 TURNER
已選擇14行。
已用時間: 00: 00: 00.31
SQL> select deptno,ename,sal,lag(ename,2,'example') over(partition by deptno order by ename) from em
p order by deptno;
DEPTNO ENAME SAL LAG(ENAME,
---------- ---------- ---------- ----------
10 CLARK 2450 example
KING 5000 example
MILLER 1300 CLARK
20 ADAMS 1100 example
FORD 3000 example
JONES 2975 ADAMS
SCOTT 3000 FORD
SMITH 800 JONES
30 ALLEN 1600 example
BLAKE 2850 example
JAMES 950 ALLEN
MARTIN 1250 BLAKE
TURNER 1500 JAMES
WARD 1250 MARTIN
已選擇14行。
相關文章
一文教會你配置使用Navicat或PLSQL可視化工具遠程連接Oracle
Navicat是一款數(shù)據(jù)庫管理工具,是一個可多重連線資料庫的管理工具,下面這篇文章主要給大家介紹了關于配置使用Navicat或PLSQL可視化工具遠程連接Oracle的相關資料,需要的朋友可以參考下2023-04-04查看oracle數(shù)據(jù)庫的編碼及修改編碼格式的方法
本節(jié)主要介紹了如何查看oracle數(shù)據(jù)庫的編碼及修改編碼格式,需要的朋友可以參考下2014-07-07oracle impdp network_link參數(shù)使用介紹
本文將介紹oracle impdp network_link參數(shù)使用方法,需要了解更多的朋友可以參考下2012-11-11Oracle Listener 動態(tài)注冊 與 靜態(tài)注冊
注冊就是將數(shù)據(jù)庫作為一個服務注冊到監(jiān)聽程序??蛻舳瞬恍枰罃?shù)據(jù)庫名和實例名,只需要知道該數(shù)據(jù)庫對外提供的服務名就可以申請連接到數(shù)據(jù)庫2015-12-12