rank() over

刺骨的言语ヽ痛彻心扉 2022-08-23 11:53 136阅读 0赞

1、partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组。

2、Rank 是在每个分组内部进行排名的。

例如:查询emp表中每个部门中工资前三名的员工的全部字段

SQL> select * from (select e.*,rank() over (partition by deptno order by sal) rk from emp e) t1 where t1.rk<=3;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO RK

-—— ————— ————- ———- ——————— ——— ——— ——— —————

7934 MILLER CLERK 7782 23-1月 -82 1300 10 1

7782 CLARK MANAGER 7839 09-6月 -81 2450 10 2

7839 KING PRESIDENT 17-11月-81 5000 10 3

7369 SMITH CLERK 7902 17-12月-80 800 20 1

7566 JONES MANAGER 7839 02-4月 -81 2975 20 2

7902 FORD ANALYST 7566 03-12月-81 3000 20 3

7900 JAMES CLERK 7698 03-12月-81 950 30 1

7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 2

7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 2

已选择9行。

rank和dense_rank

根据order by的内容依次赋予递增序列

rank 和 dense_rank区别:

他们遇到相同值不会递增 都显示当前序列值

遇到相同值rank会跳号,dense_rank不跳号

但下一个不同的值出现时:

rank: 会累计

dense_rank:不会累计

SQL> select * from (select e.*,dense_rank() over (partition by deptno order by sal) rk from emp e) t1 where t1.rk<=3;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO RK
-—— ————— ————- ——- —————- ————- ————- ——— —————
7934 MILLER CLERK 7782 1982/1/23 1300.00 10 1
7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 2
7839 KING PRESIDENT 1981/11/17 5000.00 10 3
7369 SMITH CLERK 7902 1980/12/17 800.00 20 1
7876 ADAMS CLERK 7788 1987/5/23 1100.00 20 2
7566 JONES MANAGER 7839 1981/4/2 2975.00 20 3
7900 JAMES CLERK 7698 1981/12/3 950.00 30 1
7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30 2
7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30 2
7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30 3

10 rows selected

发表评论

表情:
评论列表 (有 0 条评论,136人围观)

还没有评论,来说两句吧...

相关阅读