日期:2014-05-17  浏览次数:21194 次

倒在了一道小查询问题面前。
刚才去面试,面试的老师问了下面的这个问题,我没有写出来,估计面试就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
引用楼主 gy_20080828 的帖子:
刚才去面试,面试的老师问了下面的这个问题,我没有写出来,估计面试就OVER了,这到无所谓,但是我十分想弄清这个问题,

有一张表 结构是这样的
(ID,姓名,部门号,工资)

要求,查询出每个部门工资最高的3个员工的记录,并显示出来(如果有N个部门,那么就要显示3*N条记录)

这个语句怎么写啊?提示一个思路就行。。

------解决方案--------------------
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;