求每个部门中薪水最高的前两个人的名字       -----------------------
        EMP: 雇员表
        -----------------------
             Name             Null?    Type
            ---------------- -------- -------------- 
             EMPNO            NOT NULL NUMBER(4)    雇员编号
             ENAME            VARCHAR2(10)          雇员姓名
             JOB              VARCHAR2(9)           工种
             MGR              NUMBER(4)             经理编号
             HIREDATE         DATE                  入职日期
             SAL              NUMBER(7,2)           月薪
             COMM             NUMBER(7,2)           奖金
             DEPTNO           NUMBER(2)             部门编号
             
      __________________________________
      dept: 部门表
              Name                 Null?    Type
              -------------------- --------------
              DEPTNO               NOT NULL NUMBER(2) 部门编号
              DNAME                VARCHAR2(14)       部门名称
              LOC                  VARCHAR2(13)       部门地址想了半天,不知道怎么写。

解决方案 »

  1.   

    试着写了下,不知道对不对。O(∩_∩)O~
    select emp.ename 
    from emp,dept 
    where emp.deptno= dept.deptno 
    and emp.empno in(select empno 
                     from emp e,dept d 
                     where e.deptno= d.deptno 
                     and d.deptno =dept.deptno 
                     and rownum<3 order by emp.sal desc )
    group by dept.deptno 
    order by emp.sal desc;
      

  2.   

    多谢vmile925.我也不知道对不对。自己的机器上没有服务器。明天去试一下。
    但是子查询我有点不明白。能解释一下思路吗。
      

  3.   

    select * from (
    select dense_rank() over(partition by emp.deptno order by sal desc) as den,
           emp.ename,
           emp.deptno,
           emp.sal
      from emp ) a
      where a.den < 3这些就可以啦,楼主试试看
      

  4.   

    3楼的  问个问题   dense_rank() 和 rank() 要是出现相同工资的怎么办
    感觉还是用rank()
    不是很明白  学习   
      

  5.   

    dense_rank 有相同的就并列,不跳过下一排名,比如两个人并列第一,还是会有第二名的RANK是有相同就并列,跳过下一排名,比如两个第一,下一个就是3,如果有三个,下一个就是4
    主要是看你想如何取
    如果严格要求只取两个人,则要用row_number
    如果只要示工资前两高的人,则用dense_rank比较合适