【问题标题】:Nth max salary in OracleOracle中的第N个最高薪水
【发布时间】:2013-12-04 03:52:25
【问题描述】:

要找出我正在使用以下查询的 oracle 中的第 N 个 max sal

SELECT DISTINCE sal 
FROM emp a 
WHERE (
       SELECT COUNT(DISTINCE sal) 
       FROM emp b 
       WHERE a.sal<=b.sal)=&n;
  • 但根据我的说法,如果使用上述查询,如果表很大,则执行时间会更长。

  • 我正在尝试使用以下查询

    SELECT sal 
    FROM (
          SELECT DISTINCE sal 
          FROM emp 
               ORDER BY sal DESC ) 
    WHERE rownum=3;
    
  • 但没有得到输出..请提供任何建议..请分享有关如何优化查询和减少查询执行时间的任何链接。

【问题讨论】:

标签: sql oracle oracle11g


【解决方案1】:

select MIN(salary) from(按 SALARY DESC 从员工订单中选择不同的薪水)WHERE ROWNUM

【讨论】:

    【解决方案2】:
    SELECT MIN(Salary) salary
    FROM    (
                SELECT DISTINCT Salary 
                FROM Employee
                ORDER BY Salary DESC
            )
    WHERE ROWNUM <= n
    ORDER BY salary ASC;
    

    -- 将第 7 行中的“n”替换为您想要的任何内容

    【讨论】:

      【解决方案3】:

      在我的情况下,此查询已成功执行 (Oracle)。

      select salary from 
      (select salary, (dense_rank() 
      over (order by salary desc)) R 
      from employees)  
      where R='10' group by salary;
      

      您可以将值“10”替换为任何值“n”。

      【讨论】:

        【解决方案4】:

        我们也可以这样写。

        select min(sal) from (select sal from emp where rownum=<&n order by sal desc);
        

        【讨论】:

        • 代码将无法正常工作,因为没有正确应用rownum,rownum在结果之后被添加。
        【解决方案5】:

        以下解决方案从 12c 开始有效:

        Select min(sal) from emp where 
        Sal in ( select distinct (sal) from emp order by sal desc fetch first n rows only);
        

        根据您的要求替换n

        【讨论】:

          【解决方案6】:

          试试这个:

          Select sal 
          From (Select rownum as rank, empno,ename,sal
                From (Select * 
                      From emp order by sal desc)
                ) 
          where rank=2;
          

          只需将数字添加为 rank,这将为您提供第 n 高的薪水。

          【讨论】:

            【解决方案7】:
            select * from (select rownum as rownumber,emp1.* from (select * from emp order by sal desc) emp1) where rownumber = 3;
            

            【讨论】:

            • 您好,欢迎来到 stackoverflow,感谢您的回答。虽然这段代码可能会回答这个问题,但您是否可以考虑添加一些解释来说明您解决了什么问题,以及您是如何解决的?这将有助于未来的读者更好地理解您的答案并从中学习。
            【解决方案8】:
            SELECT Min(sal)
            FROM   (SELECT DISTINCT sal
                    FROM   emp
                    WHERE  sal IS NOT NULL
                    ORDER  BY sal DESC)
            WHERE  rownum <= n;  
            

            【讨论】:

            • 一些解释总是有帮助的
            【解决方案9】:

            您可以使用 Dense_rank() 函数优化查询。

            例如:

            从中选择不同的薪水 (选择薪水,dense_rank()超过(按薪水降序排序)排名 从员工 ) 其中排名 = 6

            注意:排名第6为第n次。

            【讨论】:

            【解决方案10】:

            试试这个:

            SELECT min(sal)  FROM (
            SELECT sal FROM emp ORDER BY sal desc) WHERE ROWNUM <= 3; -- Replace 3 with any value of N
            

            【讨论】:

              【解决方案11】:
              Select min(salary) from (
                select distinct(salary) from empdetails order by salary desc
              ) where rownum <=&rn
              

              只要输入你想要的第n个数字。

              【讨论】:

                【解决方案12】:
                select min(sal) from (select distinct(sal) from emp  order by sal desc) where rownum <=&n;
                

                内部查询select distinct(sal) from emp order by sal desc 将给出如下输出。

                SAL 5000 3000 2975 2850 2450 1600 1500 1300 1250 1100 950 800

                在上述查询中没有不同 select sal from emp order by sal desc 输出如下。

                SAL 5000 3000 3000 2975 2850 2450 1600 1500 1300 1250 1250 1100 950 800

                外部查询将给出'N'th max sal(例如)我在这里尝试了 4th Max sal 并输出如下所示。

                最小(SAL) 2850

                【讨论】:

                  【解决方案13】:

                  这也可以:

                  with data as 
                  (
                  select sal,rwid from (
                  select salary as sal,rowid as rwid from salary order by salary desc
                  )
                  where rownum < 5
                  )
                  select * from salary a 
                  where rowid = (select min(rwid) from data)
                  

                  【讨论】:

                    【解决方案14】:

                    这些查询也可以:

                    解决方法 1)

                    SELECT ename, sal 
                    FROM Emp e1 WHERE n-1 = (SELECT COUNT(DISTINCT sal) 
                                             FROM Emp e2 WHERE e2.sal > e1.sal)
                    

                    解决方法 2) 使用 row_num 函数。

                    SELECT * 
                    FROM ( 
                       SELECT e.*, ROW_NUMBER() OVER (ORDER BY sal DESC) rn FROM Emp e 
                    ) WHERE rn = n;
                    

                    解决方法 3 ) 使用 rownum 伪列

                    Select MAX(SAL) 
                    from (
                       Select * 
                       from (
                          Select * 
                          from EMP 
                          order by SAL Desc
                       ) where rownum <= n
                    )
                    

                    【讨论】:

                      【解决方案15】:
                      SELECT TOP (1) Salary FROM
                      (
                          SELECT DISTINCT TOP (10) Salary FROM Employee ORDER BY Salary DESC
                      ) AS Emp ORDER BY Salary
                      

                      这是第 10 的最高薪水,您可以将 10 替换为 n。

                      【讨论】:

                        【解决方案16】:

                        这将显示表员工的第三个最高薪水。 如果您想找出第 5 个或第 6 个(无论您想要什么)值,那么只需更改 where 条件,例如 where rownum&lt;=5" or "where rownum&lt;=6 等等...

                        select min(sal) from(select distinct(sal) from emp  where rownum<=3 order by sal desc);
                        

                        【讨论】:

                        • 需要更正:where 子句应该在外部查询中。它应该是:select min(sal) from(select distinct(sal) from emp order by sal desc) where rownum
                        【解决方案17】:
                        select * FROM (
                        select EmployeeID, Salary
                        , dense_rank() over (order by Salary DESC) ranking
                        from Employee
                        )
                        WHERE ranking = N;
                        

                        dense_rank() 用于薪水必须相同。因此它给出正确的输出而不是使用 rank()。

                        【讨论】:

                          【解决方案18】:

                          试试以下:

                          SELECT *
                          FROM
                            (SELECT rownum AS rn,
                              a.*
                            FROM
                              (WITH DATA AS -- creating dummy data
                              ( SELECT 'MOHAN' AS NAME, 200 AS SALARY FROM DUAL
                              UNION ALL
                              SELECT 'AKSHAY' AS NAME, 500 AS SALARY FROM DUAL
                              UNION ALL
                              SELECT 'HARI' AS NAME, 300 AS SALARY FROM DUAL
                              UNION ALL
                              SELECT 'RAM' AS NAME, 400 AS SALARY FROM DUAL
                              )
                            SELECT D.* FROM DATA D ORDER BY SALARY DESC
                              ) A
                            )
                          WHERE rn = 3; -- specify N'th highest here (In this case fetching 3'rd highest)
                          

                          干杯!

                          【讨论】:

                            【解决方案19】:

                            select min(sal) from (select distinct sal from employee order by sal DESC) where rownum

                            将数字放在您想要检索的最高销售量中。

                            【讨论】:

                            • 它在 Oracle 中工作。剩下的数据库我不知道
                            【解决方案20】:

                            现在你试试这个你肯定会得到:

                            SELECT DISTINCT sal 
                                FROM emp a 
                                WHERE (
                                       SELECT COUNT(DISTINCT sal) 
                                       FROM emp b 
                                       WHERE a.sal<=b.sal)=&n;
                            

                            供您参考,如果您想要第 n 个最低的销售额:

                            SELECT DISTINCT sal 
                            FROM emp a 
                            WHERE (
                                   SELECT COUNT(DISTINCT sal) 
                                   FROM emp b 
                                   WHERE a.sal>=b.sal)=&n;
                            

                            【讨论】:

                              【解决方案21】:

                              一共有三种方法……

                              SELECT salary,first_name,rnk 
                              FROM (SELECT salary,first_name,rank() over (order by salary desc nulls last) as                                                                  rnk from emp) where rnk=3;
                              
                              
                              SELECT salary,first_name,rnk 
                              FROM (SELECT salary,first_name,dense_rank() over (order by salary desc nulls last) as                                                                  rnk from emp) where rnk=3;
                              
                              
                              select rnk,first_name,salary 
                              from (select rownum as rnk ,first_name,salary 
                                    from (select first_name,salary 
                                          from emp order by salary desc nulls last)) where rnk=3
                              

                              【讨论】:

                                【解决方案22】:

                                第五高薪:

                                SELECT
                                    * 
                                FROM
                                    emp a 
                                WHERE 
                                    4 = (
                                        SELECT 
                                            COUNT(DISTINCT b.sal) 
                                        FROM 
                                            emp b 
                                        WHERE 
                                            a.sal < b.sal
                                    )
                                

                                将 4 替换为 N 的任意值。

                                【讨论】:

                                • 提供包含完整代码(格式正确)的答案并解释您的答案提供解决方案的原因会很有帮助。从中可以学到什么?
                                【解决方案23】:

                                请参阅以下查询以获得第 n 高薪水。通过这种方式,您可以获得第 n 高的薪水。如果您只想获得第 n 个最低工资,则需要在查询中将 DESC 替换为 ASC。

                                【讨论】:

                                • 是的。它适用于 MySQL。
                                【解决方案24】:

                                您可以将 2 替换为您想要的数字

                                select * from ( select distinct (sal),ROW_NUMBER() OVER (order by sal desc) rn from emp ) where rn=2
                                

                                【讨论】:

                                  【解决方案25】:
                                  SELECT * 
                                  FROM Employee Emp1
                                  WHERE (N-1) = ( 
                                  SELECT COUNT(DISTINCT(Emp2.Salary))
                                  FROM Employee Emp2
                                  WHERE Emp2.Salary > Emp1.Salary)
                                  

                                  【讨论】:

                                    【解决方案26】:
                                    SELECT *
                                        FROM (
                                                    SELECT empno,
                                                           deptno, sal,
                                                           dense_rank( ) over ( order by sal desc) NRANK
                                                    FROM emp
                                                )
                                        WHERE NRANK = 4
                                    

                                    【讨论】:

                                      【解决方案27】:
                                       SELECT sal
                                          FROM (
                                                      SELECT empno,
                                                                   deptno, sal,
                                                                    dense_rank( ) over ( partition by deptno order by sal desc) NRANK
                                                      FROM emp
                                                  )
                                          WHERE NRANK = 4
                                      

                                      【讨论】:

                                      • 通过上面的执行,我们将获得部门最高的薪水。我已经要求所有部门中最高的薪水。
                                      • 在这种情况下您需要删除分区,请在下面找到代码
                                      【解决方案28】:
                                      SELECT sal FROM (
                                          SELECT sal, row_number() OVER (order by sal desc) AS rn FROM emp
                                      )
                                      WHERE rn = 3
                                      

                                      是的,如果表很大,执行时间会更长。但是对于“第 N 行”查询,唯一的方法是查看所有数据并对其进行排序。如果你在sal上有一个索引,肯定会快得多。

                                      【讨论】:

                                      • 您需要在 order by 上使用desc,并且由于 OP 需要不同的薪水,因此按薪水分组对非重复排名薪水很有用。
                                      • 请务必注意 row_numberrankdense_rank 之间针对此特定要求的区别。当你有不止一个人拥有相同的薪水时会发生什么?你应该把它们算在同一个位置吗……?
                                      • @Kombajn zbożowy 如果工资是 5000,3000,5000,3000,2000 那么它会产生错误的输出吗??
                                      • 嗯,这取决于您需要的确切行为。对于薪水:5000,3000,5000,3000,2000 我会说答案是 3000(我的查询是这样的)。但是您可能想要 2000(第 3 个 unique 薪水),在这种情况下,您需要重新构建查询。
                                      • 对,应该是sal desc订购的,只是打错了,已编辑。
                                      【解决方案29】:

                                      试试这个

                                      select *
                                        from
                                        (
                                          select
                                              sal
                                                ,dense_rank() over (order by sal desc) ranking
                                          from   table
                                        )
                                        where ranking = 4 -- Replace 4 with any value of N
                                      

                                      【讨论】:

                                      • 如果两个人的薪水相同,他们必须给出相同的等级,所以在这种情况下必须使用dense_rank
                                      • 我们可以用 rank() 代替吗?
                                      • DENSE_RANK 函数的作用类似于 RANK 函数,只是它分配连续的等级。see here
                                      • 还有一个疑问请...在上面的查询中,我们只能在结果集中看到sal col..如果我想查看整个列..有什么帮助吗??
                                      猜你喜欢
                                      • 2019-05-04
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2015-03-09
                                      • 2020-06-04
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多