【问题标题】:How to get second largest or third largest entry from a table [duplicate]如何从表中获取第二大或第三大条目[重复]
【发布时间】:2010-12-19 13:55:44
【问题描述】:

谁能告诉我如何在Oracle中找出表中第N大条目

就像我们可以使用的最大一样 MAX(column_name) 有没有什么有效的方法来找到第 n 个最大的也

【问题讨论】:

    标签: sql oracle max


    【解决方案1】:
    选择 * 从 ( 选择一些列, row_number() over (order by your_sort_column desc) as row_num FROM some_table ) 吨 WHERE row_num = 3


    如果您希望your_sort_column 中不止一行具有相同的值,您还可以使用 rank() 函数

    选择 * 从 ( 选择一些列, rank() over (order by your_sort_column desc) as row_rank FROM some_table ) 吨 WHERE row_rank = 3 这可能返回不止一行..

    【讨论】:

    • +1:唯一需要注意的是 9i+ 支持分析函数。并且 DENSE_RANK 可能是比 RANK 更好的选择,具体取决于需要。
    • 不正确。 8i 中提供了分析功能:download.oracle.com/docs/cd/A87860_01/doc/server.817/a85397/…。但无论如何,8i 和 9i 都已被取消支持。因此,如果没有明确提及,没有理由发布涵盖这些版本的答案
    【解决方案2】:

    您可以使用以下查询找到列的第 N 个最大值

    SELECT * 
    FROM TableName a 
    WHERE n = (
               SELECT count( DISTINCT (b.ColumnName) )
               FROM TableName b 
               WHERE a.ColumnName <= b.ColumnName 
              );
    

    【讨论】:

    • 欢迎来到 Stack Overflow!感谢您发布您的答案!请务必仔细阅读FAQ on Self-Promotion。另请注意,每次链接到自己的网站/产品时,都要求发布免责声明。
    【解决方案3】:

    我认为下面的查询可以找到 NOT IN 的第二高记录。

    SELECT MAX( userId )
    FROM table 
    WHERE userId NOT IN ( 
                          SELECT MAX( userId )
                          FROM table
                        ); 
    

    简单实用...

    【讨论】:

      【解决方案4】:

      要获得第二高的薪水,请使用:

      select salary from 
        (select s2.salary,rownum rm from
           (select distinct salary from employees order by salary desc)
        s2 where rownum<=2)
      where rm >= 2
      

      【讨论】:

      • 工作完美,但我仍然不明白为什么在修改如下修改后查询不起作用: select s2.salary,rownum rm from (select distinct salary from employees order by Salary desc) s2 where rm
      【解决方案5】:

      它适用于第二高的薪水,

      $query = "SELECT * FROM `table_name` ORDER BY field_name` DESC LIMIT 1 , 1 "; 
      

      【讨论】:

        【解决方案6】:

        您可以ORDER BY column name 然后LIMIT 1,1 获得第二个

        编辑

        糟糕,没有看到 Oracle 标记,抱歉。
        ORDER BY column name WHERE ROWNUM = 2 应该会更好。

        【讨论】:

        【解决方案7】:
        SELECT DISTINCT (a.sal) FROM EMP A WHERE &N = (
          SELECT COUNT (DISTINCT (b.sal)) FROM EMP B WHERE a.sal<=b.sal
        );
        

        &amp;N 替换为您想要的号码。比如2会给你第二高的薪水。

        如果您使用的是 PL/SQL,只需执行该语句。它会提示输入 N。

        【讨论】:

          【解决方案8】:

          试试这个:

          SELECT DISTINCT TOP 3 id,[Password] 
          FROM Users_changepassword 
          WHERE [UserId] = 3
          ORDER BY id DESC
          

          【讨论】:

            【解决方案9】:

            试试这个,

            SELECT Sal FROM Tab ORDER BY Sal DESC LIMIT 2,1
            

            【讨论】:

              【解决方案10】:

              你可以试试这个使用oracle sql的Row_number()函数的sql

              select column_name from (
               select column_name ,  
              row_number() over (order by column_name  desc) as  row_num  
              from table_Name ) tablex
              where row_num =3
              

              【讨论】:

                【解决方案11】:
                SELECT MAX(Salary) FROM Employee
                WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee)
                

                【讨论】:

                  【解决方案12】:

                  您可以通过以下方式使用CONNECT BY PRIOR

                  CREATE TABLE t(i INT, sal INT);
                  INSERT INTO t(i, sal)
                  SELECT 1,100 FROM dual UNION
                  SELECT 2,100 FROM dual UNION
                  SELECT 3,200 FROM dual UNION
                  SELECT 4,500 FROM dual UNION
                  SELECT 5,1000 FROM dual;
                  

                  查询:

                  SELECT level, MAX(sal) AS sal
                  FROM t
                  --WHERE level = 2 -- set position here
                  CONNECT BY prior sal > sal
                  GROUP BY level
                  ORDER BY level;
                  

                  DBFiddle Demo

                  DBFiddle Demo2


                  编辑:

                  第二种方法是使用NTH_VALUE解析函数:

                  SELECT DISTINCT NTH_VALUE(sal, 2) OVER(ORDER BY sal DESC
                         ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
                  FROM t;
                  

                  DBFiddle Demo3

                  【讨论】:

                    猜你喜欢
                    • 2015-08-13
                    • 2021-12-13
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-10-16
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-09-02
                    • 2023-03-20
                    相关资源
                    最近更新 更多