SQL语句——16、排序函数

时间:2022-01-29 03:51:50

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

    繁体中文按照第一顺序是“笔画数”、第二顺序是“部首”进行排序。