BLAKE 2850 JONES 2975 SCOTT 3000 JONES 2975 SCOTT 3000 FORD 3000 SCOTT 3000 FORD 3000 KING 5000 FORD 3000 KING 5000 N/A KING 5000 N/A N/A 示例2 在LEAD() OVER()函数中同样可以使用PARTITION_CLAUSE。 break on dname skip 1 SELECT dname, ename, sal, LEAD(ename, 1, 'N/A') OVER(PARTITION BY dname ORDER BY dname, sal) next_ename, LEAD(sal, 1, null) OVER(PARTITION BY dname ORDER BY dname, sal) next_sal FROM emp, dept WHERE emp.deptno = dept.deptno ORDER BY dname, sal / DNAME ENAME SAL NEXT_ENAME NEXT_SAL -------------- ---------- ---------- ---------- ---------- ACCOUNTING MILLER 1300 CLARK 2450 CLARK 2450 KING 5000 KING 5000 N/A RESEARCH SMITH 800 ADAMS 1100 ADAMS 1100 JONES 2975 JONES 2975 SCOTT 3000 SCOTT 3000 FORD 3000 FORD 3000 N/A SALES JAMES 950 MARTIN 1250 MARTIN 1250 WARD 1250 WARD 1250 TURNER 1500 TURNER 1500 ALLEN 1600 ALLEN 1600 BLAKE 2850 BLAKE 2850 N/A LAG() OVER()
语法 LAG(field, next_number, default_value) OVER(partition_clause, orderby_clause, window_clause) 说明 LAG() OVER()函数先查询一组值,然后获取当前记录之前的第N个记录。 Field是一个字段或表达式,它为搜索提供依据。 Next_number是一个数字,它表示向后推进多少行。 Default_value表示当没有找到相关记录时将采用的默认值。 如果为LAG() OVER()提供的next_number为负数,则它与LEAD() OVER()完全相同。 示例 SELECT ename, sal, LAG(ename, 1, 'N/A') OVER(ORDER BY sal) prev_ename, LAG(sal, 1, null) OVER(ORDER BY sal) prev_sal, LAG(ename, 2, 'N/A') OVER(ORDER BY sal) prev_ename, LAG(sal, 2, null) OVER(ORDER BY sal) prev_sal FROM emp ORDER BY sal / ENAME SAL PREV_ENAME PREV_SAL PREV_ENAME PREV_SAL ---------- ---------- ---------- ---------- - --------- ---------- SMITH 800 N/A N/A JAMES 950 SMITH 800 N/A ADAMS 1100 JAMES 950 SMITH 800 WARD 1250 ADAMS 1100 JAMES 950 MARTIN 1250 WARD 1250 ADAMS 1100 MILLER 1300 MARTIN 1250 WARD 1250 TURNER 1500 MILLER 1300 MARTIN 1250 ALLEN 1600 TURNER 1500 MILLER 1300 CLARK 2450 ALLEN 1600 TURNER 1500 BLAKE 2850 CLARK 2450 ALLEN 1600 JONES 2975 BLAKE 2850 CLARK 2450 SCOTT 3000 JONES 2975 BLAKE 2850 FORD 3000 SCOTT 3000 JONES 2975 KING 5000 FORD 3000 SCOTT 3000 RANK()和DENSE_RANK()
语法 RANK()|DENSE_RANK() OVER(partition_clause, orderby_clause, window_clause) 说明 RANK()和DENSE_RANK()主要是为了解决类似于“获得某项指标排名前N位”的问题。它们对结果集中的记录进行排序,用户返回需要的前N项记录。它们的区别在于,在遇到排名相同的记录时,RANK()会将两者的排名置为相同,同时跳过后一位的排名;DENSE_RANK()则不会跳过后一位。 示例1 SELECT RANK() OVER(ORDER BY hiredate) \ DENSE_RANK() OVER(ORDER BY hiredate) \ ename, hiredate FROM emp ORDER BY hiredate / RANK DENSE_RANK ENAME HIREDATE ---------- ---------- ---------- -------- 1 1 SMITH 19801217 2 2 ALLEN 19810220 3 3 WARD 19810222 4 4 JONES 19810402 5 5 BLAKE 19810501 6 6 CLARK 19810609 7 7 TURNER 19810908 8 8 MARTIN 19810928 9 9 KING 19811117 10 10 JAMES 19811203 10 10 FORD 19811203 12 11 MILLER 19820123 13 12 SCOTT 19870419 14 13 ADAMS 19870523 示例2 在RANK()和DENSE_RANK()中还可以加入分组功能,以获得组中排名前N位的记录。下面的例子对按照参加工作的日期对员工进行了分组,排序,从中可以看出不同组中员工工作年限的排名互不影响。 SELECT RANK() OVER(PARTITION BY to_char(hiredate, 'yy') ORDER BY hiredate) \ ename, hiredate FROM emp ORDER BY hiredate / RANK ENAME HIREDATE ---------- ---------- -------- 1 SMITH 19801217 1 ALLEN 19810220 2 WARD 19810222 3 JONES 19810402 4 BLAKE 19810501 5 CLARK 19810609 6 TURNER 19810908 7 MARTIN 19810928 8 KING 19811117 9 JAMES 19811203 9 FORD 19811203 1 MILLER 19820123 1 SCOTT 19870419 2 ADAMS 19870523 FIRST_VALUE()和LAST_VALUE()
语法 FIRST_VALUE(field) OVER(partition_clause, orderby_clause, window_clause) LAST_VALUE(field) OVER(partition_clause, orderby_clause, window_clause) 说明 示例 FIRST_VALUE()和LAST_VALUE()用于返回结果集中的第一个和最后一个值。 下面的例子用FIRST_VALUE()函数比较同组中最低员工工资与其他员工的差额。同样也可以用LAST_VALUE()实现与最高员工工资的差额。 break on deptno skip 1 SELECT deptno, ename, sal, sal - FIRST_VALUE(sal) OVER(PARTITION BY deptno ORDER BY sal) diff FROM emp ORDER BY deptno, sal / DEPTNO ENAME SAL DIFF ---------- ---------- ---------- ---------- 10 MILLER 1300 0 CLARK 2450 1150 KING 5000 3700 20 SMITH 800 0 ADAMS 1100 300 JONES 2975 2175 SCOTT 3000 2200 FORD 3000 2200 30 JAMES 950 0 MARTIN 1250 300 WARD 1250 300 TURNER 1500 550 ALLEN 1600 650 BLAKE 2850 1900
其他函数
BFILENAME()
语法 说明 BFILENAME(directory, filename) 返回指向物理文件filename的指针,该指针是BFILE数据类型的对象。directory必须是一个已有的DIRECTORY类型的对象。BFILENAME通常与DBMS_LOB包一起使用。 示例
BIT_AND()
语法 说明 BITAND(nExpression1, nExpression2) 返回两个数值型数值在按位进行AND 运算后的结果。nExpression1和nExpression2是指定按位进行AND 运算的两个数值。如果 nExpression1 和 nExpression2 为非整数型,那么它们在按位进行 AND 运算之前转换为整数。BITAND( ) 将nExpression1 的每一位同nExpression2 的相应位进行比较。如果 nExpression1 和nExpression2的位都是1,相应的结果位就是1;否则相应的结果位是 0。 示例 select bitand(13, 122) from dual; 结果为8。 Oracle bitand( )函数在Oracle数据库中是很常见的,下面就为您详细介绍Oracle bitand( )函数的用法,如果您感兴趣的话,不妨一看。
Oracle bitand( )函数:
返回两个数值型数值在按位进行AND 运算后的结果。 语法
BITAND(nExpression1, nExpression2) 参数
nExpression1, nExpression2
指定按位进行AND 运算的两个数值。如果 nExpression1 和 nExpression2 为非整数型,那么它们在按位进行 AND 运算之前转换为整数。
Oracle bitand( )函数返回值类型: 数值型 说明
BITAND( ) 将 nExpression1 的每一位同 nExpression2 的相应位进行比较。如果 nExpression1 和 nExpression2 的位都是 1,相应的结果位就是 1;否则相应的结果位是 0。
下表列出对 nExpression1 和 nExpression2 按位进行 AND 运算的结果:
nExpression1 位 nExpression2 位 结果位 0 0 0 0 1 0 1 1 1 1 0 0
bitand( ) 函数示例 x = 5&& 二进制为 0101 y = 6&& 二进制为 0110
? bitand(x,y) && 返回值 4,二进制为 0100
----------------------------------------------------------------------------- 以上就是Oracle bitand( )函数的语法介绍。