Oracle NTH_VALUE分析函式及ROWS BETWEEN UNBOUNDED PRECEDING AND子句
在Oracle 10G分析函式中使用 FIRST_VALUE,LAST_VALUE 可返回第一行和最後一行值
在Oracle 11G推出更為強大NTH_VALUE 開窗分析函式,其作用取任意一行值,官方說明:
NTH_VALUE returns the measure_expr value of the nth row in the window defined by the analytic_clause
語法:
NTH_VALUE (measure_expr, n)
CREATE TABLE EMP
(
EMP_NO number,
EMP_NAME VARCHAR2(10),
DEPT_NO VARCHAR2(10),
SALARY NUMBER
);
INSERT INTO EMP VALUES(1,'Oraman','DBA',20000);
INSERT INTO EMP VALUES(2,'Ross','SA',10000);
INSERT INTO EMP VALUES(3,'James','SA',12000);
INSERT INTO EMP VALUES(8,'Terry','CTO',50000);
INSERT INTO EMP VALUES(10,'GC','DBA',15000);
INSERT INTO EMP VALUES(11,'Henry','DBA',10000);
COMMIT;
例1: 加一列取員工所在各部門中SALARY最高的薪水 (使用傳統MAX可實現)
SELECT EMP_NO,EMP_NAME,DEPT_NO,SALARY,
MAX(SALARY) OVER (PARTITION BY DEPT_NO) MAX_SALARY
FROM EMP;
例2: 加一列取員工所在各部門中SALARY最高的員工 (使用LAST_VALUE可實現)
SELECT EMP_NO,EMP_NAME,DEPT_NO,SALARY,
LAST_VALUE(EMP_NAME) OVER (PARTITION BY DEPT_NO order by SALARY ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) MAX_EMP
FROM EMP;
在Oracle 11G推出更為強大NTH_VALUE 開窗分析函式,其作用取任意一行值,官方說明:
NTH_VALUE returns the measure_expr value of the nth row in the window defined by the analytic_clause
語法:
NTH_VALUE (measure_expr, n)
[ FROM { FIRST | LAST } ][ { RESPECT | IGNORE } NULLS ] OVER (analytic_clause)舉例說明:
CREATE TABLE EMP
(
EMP_NO number,
EMP_NAME VARCHAR2(10),
DEPT_NO VARCHAR2(10),
SALARY NUMBER
);
INSERT INTO EMP VALUES(1,'Oraman','DBA',20000);
INSERT INTO EMP VALUES(2,'Ross','SA',10000);
INSERT INTO EMP VALUES(3,'James','SA',12000);
INSERT INTO EMP VALUES(8,'Terry','CTO',50000);
INSERT INTO EMP VALUES(10,'GC','DBA',15000);
INSERT INTO EMP VALUES(11,'Henry','DBA',10000);
COMMIT;
例1: 加一列取員工所在各部門中SALARY最高的薪水 (使用傳統MAX可實現)
SELECT EMP_NO,EMP_NAME,DEPT_NO,SALARY,
MAX(SALARY) OVER (PARTITION BY DEPT_NO) MAX_SALARY
FROM EMP;
例2: 加一列取員工所在各部門中SALARY最高的員工 (使用LAST_VALUE可實現)
SELECT EMP_NO,EMP_NAME,DEPT_NO,SALARY,
LAST_VALUE(EMP_NAME) OVER (PARTITION BY DEPT_NO order by SALARY ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) MAX_EMP
FROM EMP;
例3:加一列取員工所在各部門中SALARY最二高的員工(如果在11G之前會比較麻煩需使用row_number包一層再取值,11G後NTH_VALUE可完美解決,注意下面from FIRST為預設值可去掉,反之可使用from LAST)
SELECT EMP_NO,EMP_NAME,DEPT_NO,SALARY,
NTH_VALUE(EMP_NAME,2) from FIRST OVER (PARTITION BY DEPT_NO order by SALARY desc ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) MAX_EMP
FROM EMP;
附:
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 語法含義:
取當前行之前多少行 到 當前行之後多少行的記錄,這裡BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 就是指所有行
如果 ROWS BETWEEN..AND 沒有指明,預設為:RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW,即從最開始行到當前行
SELECT EMP_NO,EMP_NAME,DEPT_NO,SALARY,
NTH_VALUE(EMP_NAME,2) from FIRST OVER (PARTITION BY DEPT_NO order by SALARY desc ) MAX_EMP
FROM EMP;
為什麼 1 Oraman DBA 20000行MAX_EMP為空?因為取值是從最開始行到當前行的值,這裡DBA部門工資排二的還沒有出現。SELECT EMP_NO,EMP_NAME,DEPT_NO,SALARY,
NTH_VALUE(EMP_NAME,2) from FIRST OVER (PARTITION BY DEPT_NO order by SALARY desc ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) MAX_EMP
FROM EMP;
附:
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 語法含義:
取當前行之前多少行 到 當前行之後多少行的記錄,這裡BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 就是指所有行
如果 ROWS BETWEEN..AND 沒有指明,預設為:RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW,即從最開始行到當前行
官方說明:
If you omit the windowing_clause entirely, then the default is RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
SELECT EMP_NO,EMP_NAME,DEPT_NO,SALARY,
NTH_VALUE(EMP_NAME,2) from FIRST OVER (PARTITION BY DEPT_NO order by SALARY desc ) MAX_EMP
FROM EMP;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25583515/viewspace-2148351/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 視窗函式 (轉) rows between unbounded preceding and current row函式
- OLAP 函式 (rows 2 preceding / unbounded preceding)函式
- Oracle開發之:視窗函式 (轉) rows between unbounded preceding and current rowOracle函式
- [轉]OLAP 函式 (rows 2 preceding / unbounded preceding)函式
- Oracle開發專題之:OLAP 函式 (rows 2 preceding / unbounded preceding)Oracle函式
- 分析函式用法及視窗子句 range/rows差別函式
- 分析函式視窗子句 RANGE/ROWS 差別函式
- 分析函式之視窗子句函式
- oracle的sql查詢分析函式-高階部分-分析函授over()子句OracleSQL函式
- 【Oracle SQL】months_between與trunc函式OracleSQL函式
- oracle的分析函式over 及開窗函式Oracle函式
- oracle的分析函式over(Partition by...) 及開窗函式Oracle函式
- Oracle分析函式七——分析函式案例Oracle函式
- MySQL中BETWEEN子句的用法詳解MySql
- Oracle聚合函式/分析函式Oracle函式
- Oracle 分析函式Oracle函式
- Oracle分析函式Oracle函式
- oracle 分析函式(轉)Oracle函式
- oracle分析函式(一)Oracle函式
- Oracle常用分析函式Oracle函式
- Oracle分析函式{轉}Oracle函式
- Oracle分析函式-6Oracle函式
- Oracle分析函式-5Oracle函式
- Oracle分析函式-4Oracle函式
- Oracle分析函式-2Oracle函式
- Oracle分析函式-1Oracle函式
- Oracle分析函式-3Oracle函式
- Oracle分析函式與視窗函式Oracle函式
- 【函式】Oracle函式系列(2)--數學函式及日期函式函式Oracle
- 【分析函式】Oracle分析函式之LAG和LEAD函式Oracle
- mysql 自定義分析函式 least 及 日期函式MySql函式AST
- oracle 10g函式大全--分析函式Oracle 10g函式
- 聊聊Oracle排序分析函式Oracle排序函式
- oracle 統計分析函式Oracle函式
- ORACLE分析函式手冊Oracle函式
- Oracle 分析函式詳解Oracle函式
- Oracle 分析函式的使用Oracle函式
- Oracle的months_between(date1,date2)函式注意點Oracle函式