【问题标题】:How to find top three highest salary in emp table in oracle?如何在oracle的emp表中找到前三名的最高薪水?
【发布时间】:2010-05-31 12:13:01
【问题描述】:

如何在oracle中找到emp表中最高薪水的前三名?

【问题讨论】:

    标签: sql oracle oracle10g


    【解决方案1】:
    SELECT  *FROM 
        (
        SELECT *FROM emp 
        ORDER BY Salary desc
        )
    WHERE rownum <= 3
    ORDER BY Salary ;
    

    【讨论】:

    • 为什么 ORDER BY Salary 需要在 WHERE 之后??
    • 因为没有它工资会按降序排列
    【解决方案2】:

    你可以试试。

       SELECT * FROM 
         (
          SELECT EMPLOYEE, LAST_NAME, SALARY,
          RANK() OVER (ORDER BY SALARY DESC) EMPRANK
          FROM emp
         )
        WHERE emprank <= 3;
    

    即使有两个员工的最高工资相同,这也会给出正确的输出

    【讨论】:

      【解决方案3】:

      应该这样做。

      SELECT  Name, Salary
      FROM 
          (
          SELECT  Name, Salary
          FROM         emp 
          ORDER BY Salary desc
          )
      WHERE rownum <= 3
      ORDER BY Salary ;
      

      【讨论】:

        【解决方案4】:
        SELECT a.ename, b.sal
            FROM emp a, emp b
            WHERE a.empno = b.empno
                  AND
                  3 > (SELECT count(*) FROM emp b
                           WHERE a.sal = b.sal);
        

        不使用 TOP、ROWID、rank 等。也适用于最旧的 sql

        【讨论】:

          【解决方案5】:
           SELECT * FROM 
               (
                SELECT EMPLOYEE, LAST_NAME, SALARY,
                DENSE_RANK() OVER (ORDER BY SALARY DESC) EMPRANK
                FROM emp
               )
              WHERE emprank <= 3;
          

          【讨论】:

            【解决方案6】:
            Select ename, job, sal from emp
                where sal >=(select max(sal) from emp
                where sal < (select max(sal) from emp
                where sal < (select max(sal) from emp)))
                order by sal;
            
            ENAME      JOB              SAL
            ---------- --------- ----------
            KING       PRESIDENT       5000
            FORD       ANALYST         3000
            SCOTT      ANALYST         3000
            

            【讨论】:

              【解决方案7】:

              你可以使用DBMS_STAT_FUNCS.Summary:

              SET SERVEROUTPUT ON;
              DECLARE
                  s DBMS_STAT_FUNCS.SummaryType;
              BEGIN
                  DBMS_STAT_FUNCS.SUMMARY('HR', 'EMPLOYEES', 'SALARY',3, s);
                  DBMS_OUTPUT.put_line('Top 3: ' || s.top_5_values(1) || '-' 
                                       || s.top_5_values(2) || '-' || s.top_5_values(3));
              END;
              /
              

              输出:

              Top 3: 24000-17000-17000
              

              【讨论】:

                【解决方案8】:
                SELECT *
                FROM emp 
                ORDER BY Salary desc
                FETCH FIRST 3 ROWS ONLY;
                

                【讨论】:

                  【解决方案9】:
                  SELECT salary,first_name||' '||last_name "Name of the employee" 
                  FROM hr.employees 
                  WHERE rownum <= 3 
                  ORDER BY salary desc ;
                  

                  【讨论】:

                  • 这肯定会给出前三名的薪水员工的名字以及他们的薪水
                  • -1 这将无法可靠地工作,请参阅 the manual 了解为什么不应以这种方式使用 ROWNUM
                  【解决方案10】:
                      select empno,salary from emp e
                       where 3 > ( Select count(salary) from emp
                        where e.salary < salary )
                  
                  
                  Another way :
                  
                      select * from
                      (
                      select empno,salary,
                      Rank() over(order by salary desc) as rank from emp )
                      where Rank <= 3;
                  
                  Another Way :
                  
                      select * from
                      (
                      select empno,salary from emp
                      order by salary desc
                      )
                      where rownum <= 3;
                  

                  【讨论】:

                  • 请格式化您发布的 SQL。选择代码并点击 {} 按钮。
                  【解决方案11】:
                  SELECT  Name, Salary
                  FROM 
                      (
                      SELECT  Name, Salary
                      FROM         emp 
                      ORDER BY Salary desc
                      )
                  WHERE rownum <= 3
                  ORDER BY Salary ;
                  

                  【讨论】:

                    【解决方案12】:

                    select top(3) min(Name),TotalSalary,ROW_NUMBER() OVER (Order by TotalSalary desc) AS RowNumber FROM tbl_EmployeeProfile 组按 TotalSalary

                    【讨论】:

                      【解决方案13】:

                      将查询限制为仅显示薪酬最高的前 3 名员工。 : 查询 « Oracle PL / SQL

                      create table employee(
                               emp_no                 integer         primary key
                              ,lastname               varchar2(20)    not null
                              ,salary                 number(3)
                      );
                      
                      insert into employee(emp_no,lastname,salary)
                                    values(1,'Tomy',2);
                      
                      insert into employee(emp_no,lastname,salary)
                                    values(2,'Jacky',3);
                      
                      insert into employee(emp_no,lastname,salary)
                                    values(3,'Joey',4);
                      
                      insert into employee(emp_no,lastname,salary)
                                    values(4,'Janey',5);
                      
                      
                      select lastname,  salary
                      from (SELECT lastname, salary FROM employee ORDER BY salary DESC)
                      where rownum <= 3 ;
                      

                      输出

                      LASTNAME                 SALARY
                      
                      -------------------- ----------
                      Janey                         5
                      
                      Joey                          4
                      
                      Jacky                         3
                      
                      drop table employee;
                      

                      【讨论】:

                        【解决方案14】:
                        SELECT * FROM
                             (
                              SELECT  ename, sal,
                              DENSE_RANK() OVER (ORDER BY SAL DESC) EMPRANK
                              FROM emp 
                             )
                            emp1 WHERE emprank <=5
                        

                        【讨论】:

                          【解决方案15】:
                          SELECT DISTINCT(salary) FROM emp order by salary asc limit 0 ,3
                          

                          上面的查询给出了三个最高薪水 DISTINCT

                          【讨论】:

                            【解决方案16】:
                            SELECT * FROM Employees
                            WHERE rownum <= 3
                            ORDER BY Salary ;
                            

                            【讨论】:

                              【解决方案17】:

                              在sql server中查找top 5薪水的解决方案

                              select top(1) name,salary from Salary where Salary in(select distinct top(3) Salary from Salary order by Salary disc)

                              【讨论】:

                              • 请尽量充实您的答案并改进格式。还要考虑您的答案是否相关,因为它包含其他答案中缺少的信息。
                              【解决方案18】:
                              select top 3 * from emp  order by sal desc
                              

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 2013-12-04
                                • 2019-05-04
                                • 1970-01-01
                                • 2020-01-29
                                • 2015-11-20
                                • 2011-01-30
                                • 2021-03-04
                                相关资源
                                最近更新 更多