求一条查询语句 , EMP有3个字段 EMANE,DEPTNO,SAL求查询每个部门薪水前十名的纪录 用一条SQL语句

解决方案 »

  1.   

    SELECT *
      FROM (SELECT ENAME,
                   DEPTNO,
                   SAL,
                   RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL) RK
              FROM EMP)
     WHERE RK <= 10;
      

  2.   

    SELECT *
      FROM (SELECT ENAME,
                   DEPTNO,
                   SAL,
                   RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) RK
              FROM EMP)
     WHERE RK <= 10;
      

  3.   

    另外一种方法:
    SELECT *
      FROM EMP E1
     WHERE (
            SELECT COUNT(1)
              FROM EMP E2
             WHERE E1.DEPTNO = E2.DEPTNO 
               AND E1.SAL < E2.SAL
           ) < 10;
      

  4.   

    RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC)  麻烦解释一下,谢谢!
      

  5.   

    1楼正解。RANK 
    功能描述:
    1、根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序,然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。每次ORDER BY表达式的值发生变化时,该序列也随之增加。有同样值的行得到同样的数字序号(认为null时相等的)。
    2、如果两行得到同样的排序,则序数将随后跳跃。如:若两行序数为1,则没有序数2,序列将给组中的下一行分配值3。DENSE_RANK则没有任何跳跃。