• Oracle提供的序号函数


    Oracle提供的序号函数

    以emp表为例:
    1: rownum 最简单的序号 但是在order by之前就确定值.
    select rownum,t.* from emp t order by ename
     行数 ROWNUM EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
    1 11 7876 ADAMS CLERK 7788 1987-5-23 1100   20
    2 2 7499 ALLEN SALESMAN 7698 1981-2-20 1600 300 30
    3 6 7698 BLAKE MANAGER 7839 1981-5-1 2850   30
    4 7 7782 CLARK MANAGER 7839 1981-6-9 2450   10
    5 13 7902 FORD ANALYST 7566 1981-12-3 3000   20
    6 12 7900 JAMES CLERK 7698 1981-12-3 950   30
    7 4 7566 JONES MANAGER 7839 1981-4-2 2975   20
    8 9 7839 KING PRESIDENT   1981-11-17 5000   10
    9 5 7654 MARTIN SALESMAN 7698 1981-9-28 1250 1400 30
    10 14 7934 MILLER CLERK 7782 1982-1-23 1300   10
    11 8 7788 SCOTT ANALYST 7566 1987-4-19 3000   20
    12 1 7369 SMITH CLERK 7902 1980-12-17 800   20
    13 10 7844 TURNER SALESMAN 7698 1981-9-8 1500 0 30
    14 3 7521 WARD SALESMAN 7698 1981-2-22 1250 500 30

    2: row_number() over( order by 字段名1,字段名2,...字段名n ) 先排序再确定序号.
    select row_number() over( order by ename ) as rm, t.* from emp t
       行数 RM EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
    1 1 7876 ADAMS CLERK 7788 1987-5-23 1100   20
    2 2 7499 ALLEN SALESMAN 7698 1981-2-20 1600 300 30
    3 3 7698 BLAKE MANAGER 7839 1981-5-1 2850   30
    4 4 7782 CLARK MANAGER 7839 1981-6-9 2450   10
    5 5 7902 FORD ANALYST 7566 1981-12-3 3000   20
    6 6 7900 JAMES CLERK 7698 1981-12-3 950   30
    7 7 7566 JONES MANAGER 7839 1981-4-2 2975   20
    8 8 7839 KING PRESIDENT   1981-11-17 5000   10
    9 9 7654 MARTIN SALESMAN 7698 1981-9-28 1250 1400 30
    10 10 7934 MILLER CLERK 7782 1982-1-23 1300   10
    11 11 7788 SCOTT ANALYST 7566 1987-4-19 3000   20
    12 12 7369 SMITH CLERK 7902 1980-12-17 800   20
    13 13 7844 TURNER SALESMAN 7698 1981-9-8 1500 0 30
    14 14 7521 WARD SALESMAN 7698 1981-2-22 1250 500 30

    3: 和上面的不同之处在于PARTITION分区.在每一个小分区内部取序号.
    select row_number() over(PARTITION BY deptno order by sal ) as rm, t.* from emp t
       行数 RM EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
    1 1 7934 MILLER CLERK 7782 1982-1-23 1300   10
    2 2 7782 CLARK MANAGER 7839 1981-6-9 2450   10
    3 3 7839 KING PRESIDENT   1981-11-17 5000   10
    4 1 7369 SMITH CLERK 7902 1980-12-17 800   20
    5 2 7876 ADAMS CLERK 7788 1987-5-23 1100   20
    6 3 7566 JONES MANAGER 7839 1981-4-2 2975   20
    7 4 7788 SCOTT ANALYST 7566 1987-4-19 3000   20
    8 5 7902 FORD ANALYST 7566 1981-12-3 3000   20
    9 1 7900 JAMES CLERK 7698 1981-12-3 950   30
    10 2 7521 WARD SALESMAN 7698 1981-2-22 1250 500 30
    11 3 7654 MARTIN SALESMAN 7698 1981-9-28 1250 1400 30
    12 4 7844 TURNER SALESMAN 7698 1981-9-8 1500 0 30
    13 5 7499 ALLEN SALESMAN 7698 1981-2-20 1600 300 30
    14 6 7698 BLAKE MANAGER 7839 1981-5-1 2850   30

    4: rank()在这里表示针对每个部门员工的工资取序号.
    select rank() over(PARTITION BY deptno order by sal ) as rnk, t.* from emp t;
       行数 RNK EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
    1 1 7934 MILLER CLERK 7782 1982-1-23 1300   10
    2 2 7782 CLARK MANAGER 7839 1981-6-9 2450   10
    3 3 7839 KING PRESIDENT   1981-11-17 5000   10
    4 1 7369 SMITH CLERK 7902 1980-12-17 800   20
    5 2 7876 ADAMS CLERK 7788 1987-5-23 1100   20
    6 3 7566 JONES MANAGER 7839 1981-4-2 2975   20
    7 4 7788 SCOTT ANALYST 7566 1987-4-19 3000   20
    8 4 7902 FORD ANALYST 7566 1981-12-3 3000   20
    9 1 7900 JAMES CLERK 7698 1981-12-3 950   30
    10 2 7521 WARD SALESMAN 7698 1981-2-22 1250 500 30
    11 2 7654 MARTIN SALESMAN 7698 1981-9-28 1250 1400 30
    12 4 7844 TURNER SALESMAN 7698 1981-9-8 1500 0 30
    13 5 7499 ALLEN SALESMAN 7698 1981-2-20 1600 300 30
    14 6 7698 BLAKE MANAGER 7839 1981-5-1 2850   30

    5: 从例子中可以看到dense_rank()和rank()的唯一区别就是:
    dense_rank()中并列第二名后是第三名.
    rank()中并列第二名后是第四名.
    select dense_rank() over(PARTITION BY deptno order by sal ) as dense_rnk, t.* from emp t;
       行数 DENSE_RNK EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
    1 1 7934 MILLER CLERK 7782 1982-1-23 1300   10
    2 2 7782 CLARK MANAGER 7839 1981-6-9 2450   10
    3 3 7839 KING PRESIDENT   1981-11-17 5000   10
    4 1 7369 SMITH CLERK 7902 1980-12-17 800   20
    5 2 7876 ADAMS CLERK 7788 1987-5-23 1100   20
    6 3 7566 JONES MANAGER 7839 1981-4-2 2975   20
    7 4 7788 SCOTT ANALYST 7566 1987-4-19 3000   20
    8 4 7902 FORD ANALYST 7566 1981-12-3 3000   20
    9 1 7900 JAMES CLERK 7698 1981-12-3 950   30
    10 2 7521 WARD SALESMAN 7698 1981-2-22 1250 500 30
    11 2 7654 MARTIN SALESMAN 7698 1981-9-28 1250 1400 30
    12 3 7844 TURNER SALESMAN 7698 1981-9-8 1500 0 30
    13 4 7499 ALLEN SALESMAN 7698 1981-2-20 1600 300 30
    14 5 7698 BLAKE MANAGER 7839 1981-5-1 2850   30

  • 相关阅读:
    淘宝客服务费和佣金的区别是什么
    java编程出现的错误对应的解决方法
    若遇到APP无法抓包怎么办,可以通过安装drony 进行转发抓包
    Android逆向—苏宁金融app的data参数分析
    GMSSL 支持SM2/SM3/SM4
    Frida安装和使用
    JS 解析 bytearray 成字符串
    Pytorch-tensor的创建,索引,切片
    深度学习实战之线性回归1
    CCF CSP 201803-2 碰撞的小球
  • 原文地址:https://www.cnblogs.com/frogbag/p/2098504.html
Copyright © 2020-2023  润新知