select name,class,s,rank()over(partition by class order by s desc) mm from tableA;
这条sql语句里很多函数以前都没用过,比如 rank() over() partition by ,网上查了说是聚合函数和分析函数,但确实没搞明白都是怎么用的,都用来干什么的。
谁帮我解释下,最好举个小例子, 谢谢了~~
这条sql语句里很多函数以前都没用过,比如 rank() over() partition by ,网上查了说是聚合函数和分析函数,但确实没搞明白都是怎么用的,都用来干什么的。
谁帮我解释下,最好举个小例子, 谢谢了~~
解决方案 »
- 哪位大侠能够指点一下,下载Oracle安装文件的时候,上面提示的Product是Family,是不是表示个人版呢
- 请问个关于查询的问题,关于时间套叠的!
- oracle 10g登陆失败,ora-12170连接超时
- job 为何执行不了建立索引
- 求助,编程,好心人请进.
- ☆★○●查询树型结构数据并与别的表关联?●○★☆很有代表性,建议管理员置顶!!!
- 求查询指定表的字段名和字段数据类型及约束条件的SQL语句
- 为什么建立分区了,select * from table_name partition(part_name)还是全表扫描呢?
- oracle 的客户端要什么软件,(急!请教!)
- PLSQL Developer创建新的Table时报错,“无效的表分区方法",请问是什么原因啊
- 求个SQL语句
- oracle异构mysql 求解
SQL> select * from emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10
7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30
7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10已选择14行。--按照部门内薪水从高到低排名次
SQL> SELECT t.empno 员工号,
2 t.ename 姓名,
3 t.deptno 部门号,
4 t.sal 薪水,
5 dense_rank() over(PARTITION BY t.deptno ORDER BY t.sal DESC) 名次
6 FROM emp t; 员工号 姓名 部门号 薪水 名次
---------- ---------- ---------- ---------- ----------
7839 KING 10 5000 1
7782 CLARK 10 2450 2
7934 MILLER 10 1300 3
7788 SCOTT 20 3000 1
7902 FORD 20 3000 1
7566 JONES 20 2975 2
7876 ADAMS 20 1100 3
7369 SMITH 20 800 4
7698 BLAKE 30 2850 1
7499 ALLEN 30 1600 2
7844 TURNER 30 1500 3
7654 MARTIN 30 1250 4
7521 WARD 30 1250 4
7900 JAMES 30 950 5已选择14行。
dense_rank() --排名分析函数
over (PARTITION BY t.deptno --按部门分组
ORDER BY t.sal DESC --按薪水排降序)
--他们都是评级函数:
rank() over (partition by deptno order by sal)
--在遇到相等的排名时,会在名次中留下空位:
JAMES CLERK 950.00 30 1
WARD SALESMAN 1250.00 30 2--第二名
MARTIN SALESMAN 1250.00 30 2--第二名
TURNER SALESMAN 1500.00 30 4--第四名
ALLEN SALESMAN 1600.00 30 5
BLAKE MANAGER 2850.00 30 6
--
dense_rank() over (partition by deptno order by sal)
--在遇到相同的排名时,不留下空位:
JAMES CLERK 950.00 30 1
WARD SALESMAN 1250.00 30 2--第二名
MARTIN SALESMAN 1250.00 30 2--第二名
TURNER SALESMAN 1500.00 30 3--第三名
ALLEN SALESMAN 1600.00 30 4
BLAKE MANAGER 2850.00 30 5--你可以使用row_number()为每一个小分组返回一个行号,而不管具体的相等情况,
--也就是查询到谁再前面就谁先排序
SQL> select ename,job,sal,deptno,
2 row_number() over (partition by deptno order by sal) rk
3 from emp;
ENAME JOB SAL DEPTNO RK
---------- --------- --------- ------ ----------
MILLER CLERK 1300.00 10 1
CLARK MANAGER 2450.00 10 2
KING PRESIDENT 5000.00 10 3SMITH CLERK 800.00 20 1
ADAMS CLERK 1100.00 20 2
JONES MANAGER 2975.00 20 3
FORD ANALYST 3000.00 20 4
SCOTT ANALYST 3100.00 20 5JAMES CLERK 950.00 30 1
WARD SALESMAN 1250.00 30 2--sal相等
MARTIN SALESMAN 1250.00 30 3--sal相等
TURNER SALESMAN 1500.00 30 4
ALLEN SALESMAN 1600.00 30 5
BLAKE MANAGER 2850.00 30 6
14 rows selected
row_number() over (partition by deptno order by sal)
partition by先分组然后获得行号,最后返回结果
group by将得到的结果分组。
group by 和 partition by的比较