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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值