刚才去面试,面试的老师问了下面的这个问题,我没有写出来,估计面试就OVER了,这到无所谓,但是我十分想弄清这个问题,
有一张表 结构是这样的
(ID,姓名,部门号,工资)
要求,查询出每个部门工资最高的3个员工的记录,并显示出来(如果有N个部门,那么就要显示3*N条记录)
这个语句怎么写啊?提示一个思路就行。。
------解决方案--------------------
SELECT *
FROM (SELECT ENAME,
DEPTNO,
SAL,
RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL) RK
FROM EMP)
WHERE RK <= 10;
-- 2nd way:
SELECT *
FROM EMP E1
WHERE (
SELECT COUNT(1)
FROM EMP E2
WHERE E1.DEPTNO = E2.DEPTNO
AND E1.SAL < E2.SAL
) < 10;
------解决方案--------------------
修改上个帖子 : 求 前3 就把10 改成3 就可以了
用的到的表是 oracle 9i 中的 emp 表
SQL> desc emp;
名称
--------------------------
EMPNO
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
------- ---------- --------- ---------- ---------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
------- ---------- --------- ---------- ---------- ---------- ---------- ----------
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
------解决方案--------------------
分析函数
- SQL code
select * from (select t.*,row_number() over(partition by 部门号 order by 工资) rn from table t) where rn<=3
------解决方案--------------------
FYI: 问题10
http://topic.csdn.net/u/20081002/00/f8d90ba2-e2bb-412a-a0c5-1b6d518fc22a.html
------解决方案--------------------
- SQL code
SELECT * FROM (SELECT EID, ENAME, DEPTNO, SAL, ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) RN FROM EMP) WHERE RN <= 3;