row_number
和伪列rownum类似,都是产生顺序的序列号的,但这个分析函数row_number并不是为整个select数据产生序列,而是为分组后的每个组内产生序列。
比如,要取出每个部分的前两个最高工资的员工
SQL> select deptno,ename,sal from (select deptno,ename,sal, row_number() over(partition by deptno order by sal desc) drn from emp) where drn <=2; DEPTNO ENAME SAL ---------- ---------- ---------- 10 KING 5000 CLARK 2450 20 SCOTT 3000 FORD 3000 30 BLAKE 2850 ALLEN 1600 6 rows selected.
rank和dense_rank
根据order by的内容依次赋予递增序列。
rank 和 dense_rank特点:
- 他们遇到相同值不会递增,都显示当前序列值
- 遇到相同值rank会跳号,dense_rank不跳号。但下一个不同的值出现时,rank会累积,dense_rank不会累积
SQL> select deptno,ename,sal, rank() over(partition by deptno order by sal desc) rank_sal, dense_rank() over(partition by deptno order by sal desc) dense_rank from emp; DEPTNO ENAME SAL RANK_SAL DENSE_RANK ---------- ---------- ---------- ---------- ---------- 10 KING 5000 1 1 10 CLARK 2450 2 2 10 MILLER 1300 3 3 20 SCOTT 3000 1 1 20 FORD 3000 1 1 20 JONES 2975 3 2 20 ADAMS 1100 4 3 20 SMITH 800 5 4 30 BLAKE 2850 1 1 30 ALLEN 1600 2 2 30 TURNER 1500 3 3 30 MARTIN 1250 4 4 30 WARD 1250 4 4 30 JAMES 950 6 5 14 rows selected.
NLSSORT() 函数:
如果数据库字符集选用的是ZH16GBK,那么使用order by默认是按照汉字的“二进制编码”顺序进行排序的。
可以使用NLSSORT()函数可以改变Oralce对汉字的排序规则,排序规则如下(前三条对简体中文进行排序,后两条对繁体中文进行排序):
1. SCHINESE_RADICAL_M
简体中文按照第一顺序是“部首”、第二顺序是“笔画数”进行排序。
2. SCHINESE_STROKE_M
简体中文按照第一顺序“笔画数”、是第二顺序是“部首”进行排序。
3. SCHINESE_PINYIN_M
简体中文按照拼音进行排序。上例中即对简体汉字按照拼音进行排序。
4. TCHINESE_RADICAL_M
繁体中文按照第一顺序是“部首”、第二顺序是“笔画数”进行排序。
5. TCHINESE_STROKE_M
繁体中文按照第一顺序是“笔画数”、第二顺序是“部首”进行排序。