【问题标题】:Query to find nᵗʰ max value of a column查询以查找列的 nᵗʰ 最大值
【发布时间】:2008-09-17 07:10:23
【问题描述】:

我要查找2nd, 3rd, ... nth 列的最大值。

【问题讨论】:

  • 什么数据库?我认为这个问题没有很好的“通用”解决方案。
  • 我认为太笼统了:至少指定哪个 DBMS...

标签: sql database


【解决方案1】:

考虑下面的 Employee 表,其中有一列表示薪水。

+------+ |萨尔 | +------+ | 3500 | | 2500 | | 2500 | | 5500 | | 7500 | +------+

以下查询将返回第 N 个最大值元素。

select SAL from EMPLOYEE E1 where 
 (N - 1) = (select count(distinct(SAL)) 
            from EMPLOYEE E2 
            where E2.SAL > E1.SAL )

例如。当需要第二个最大值时,

  select SAL from EMPLOYEE E1 where 
     (2 - 1) = (select count(distinct(SAL)) 
                from EMPLOYEE E2 
                where E2.SAL > E1.SAL )
+------+ |萨尔 | +------+ | 5500 | +------+

【讨论】:

  • 一个适用于所有数据库的简单解决方案!好想! :)
  • 很好的答案!我以前遇到过这个问题,并且对如何在不特定于供应商的情况下解决它感到困扰:) 一个可能的缺点是它为每一行执行子查询。
  • 这太棒了!我将它与>= 运算符一起使用以获取最多第 N 个位置的所有行。我想为它添加一个排名,比如最大值为“1”,第二个最大值为“2”等。你知道如何去做吗?
  • @NurShomik 如果您需要一个通用的排名函数,请参阅:stackoverflow.com/a/3333697/1385252
  • 请解释一下。我无法理解比较是如何帮助我们的。
【解决方案2】:

你没有指定哪个数据库,你可以在 MySQL 上做

SELECT column FROM table ORDER BY column DESC LIMIT 7,10;

会跳过前 7 个,然后让你获得下一个最高的 10 个。

【讨论】:

  • 如果你使用的是 mysql,这在 oracle(或者我相信的 mssql)中是行不通的
【解决方案3】:

您可以将列排序为降序格式,然后从第 n 行获取值。

编辑::

根据评论请求更新。 警告完全未经测试!

SELECT DOB FROM (SELECT DOB FROM USERS ORDER BY DOB DESC) WHERE ROWID = 6

上面的内容应该适用于 Oracle ...您可能必须首先获得正确的语法!

【讨论】:

  • 你能提供一个代码sn-p吗?我尝试了您的建议,但无法从第 n 行获取值。
  • 使用ROWID 既不安全也不实用。以sqlite 为例。 ROWID 可能会或可能不会连续生成。此外,ROWID 的顺序可能与请求列的顺序不匹配。
  • 这会很慢,因为它需要先订购整个表格,然后再选择第 n 行。一些数据库现在提供此功能,例如,请参见下面 Pieter 和 Steven Dickinson 的回答。
【解决方案4】:

同样,您可能需要修复您的数据库,但如果您希望数据集中可能存在重复值的前第二个值,您也需要进行分组:

SELECT column 
FROM table 
WHERE column IS NOT NULL 
GROUP BY column 
ORDER BY column DESC 
LIMIT 5 OFFSET 2;

会跳过前两个,然后会让你获得下一个最高的五个。

【讨论】:

    【解决方案5】:

    纯 SQL(注意:我建议使用特定于您的 DBMS 的 SQL 功能,因为它可能更有效)。这将为您提供第 n+1 个最大值(要获得最小值,请翻转

    select id from table order by id desc limit 4 ;
    +------+
    | id   |
    +------+
    | 2211 | 
    | 2210 | 
    | 2209 | 
    | 2208 | 
    +------+
    
    
    SELECT yourvalue
      FROM yourtable t1
     WHERE EXISTS( SELECT COUNT(*)
                     FROM yourtable t2
                    WHERE t1.id       <> t2.id
                      AND t1.yourvalue < t2.yourvalue
                   HAVING COUNT(*) = 3 )
    
    
    +------+
    | id   |
    +------+
    | 2208 | 
    +------+
    

    【讨论】:

      【解决方案6】:

      (表名=学生,列名=标记)

      select * from(select row_number() over (order by mark desc) as t,mark from student group by mark) as td where t=4
      

      【讨论】:

      【解决方案7】:

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

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

      【讨论】:

        【解决方案8】:
        select column_name from table_name 
        order by column_name desc limit n-1,1;
        

        其中 n = 1, 2, 3,....第 n 个最大值。

        【讨论】:

          【解决方案9】:

          这是 Oracle 的一种方法。此示例获得第 9 个最高值。只需将 9 替换为包含您要查找的位置的绑定变量。

             select created from (
               select created from (
                 select created from user_objects
                   order by created desc
                 )
                 where rownum <= 9
                 order by created asc
               )
               where rownum = 1
          

          如果您想要第 n 个唯一值,您可以在最里面的查询块上添加 DISTINCT。

          【讨论】:

            【解决方案10】:

            我自己在寻找答案时挖出了这个问题,这似乎适用于 SQL Server 2005(源自Blorgbeard's solution):

            SELECT MIN(q.col1) FROM (
                SELECT
                    DISTINCT TOP n col1
                    FROM myTable
                    ORDER BY col1 DESC
            ) q;
            

            实际上,这是一个SELECT MIN(q.someCol) FROM someTable q,表的前n个由SELECT DISTINCT...查询检索。

            【讨论】:

              【解决方案11】:
              Select max(sal) 
              from table t1 
              where N (select max(sal) 
                      from table t2 
                      where t2.sal > t1.sal)
              

              要找到第 N 个最大销售量。

              【讨论】:

                【解决方案12】:
                SELECT * FROM tablename 
                WHERE columnname<(select max(columnname) from tablename) 
                order by columnname desc limit 1
                

                【讨论】:

                  【解决方案13】:

                  这是从列中获取第 n 个最高值的查询,n=0 表示第二高,n=1 表示第三高,依此类推...

                   SELECT * FROM TableName
                   WHERE ColomnName<(select max(ColomnName) from TableName)-n order by ColomnName desc limit 1;
                  

                  【讨论】:

                    【解决方案14】:

                    简单的 SQL 查询来获取表 Employee 中具有 Nth MAX Salary 的员工详细信息。

                    sql> select * from Employee order by salary desc LIMIT 1 OFFSET <N - 1>;
                    

                    考虑表结构为:

                    员工 ( id [int 主键 auto_increment], 名称 [varchar(30)], 工资 [int] );

                    示例:

                    如果你需要上表中的第三个MAX工资,那么查询将是:

                    sql> select * from Employee order by salary desc LIMIT 1 OFFSET 2;
                    

                    同样:

                    如果你需要上表中的第8个MAX工资,那么查询将是:

                    sql> select * from Employee order by salary desc LIMIT 1 OFFSET 7;
                    

                    注意: 当您必须获得 Nth MAX 值时,您应该将 OFFSET 作为 (N - 1)

                    这样你可以在工资升序的情况下做同样的操作。

                    【讨论】:

                      【解决方案15】:

                      mysql查询假设我想从员工表中找出第 n 个最高薪水

                      select salary 
                      form employee
                      order by salary desc
                      limit n-1,1 ;
                      

                      【讨论】:

                        【解决方案16】:

                        在 SQL Server 中,只需执行以下操作:

                        select distinct top n+1 column from table order by column desc
                        

                        然后丢弃第一个值,如果你不需要它。

                        【讨论】:

                          【解决方案17】:

                          对于 SQL 2005:

                          SELECT col1 from 
                               (select col1, dense_rank(col1) over (order by col1 desc) ranking 
                               from t1) subq where ranking between 2 and @n
                          

                          【讨论】:

                            【解决方案18】:

                            MySQL:

                            select distinct(salary) from employee order by salary desc limit (n-1), 1;
                            

                            【讨论】:

                              【解决方案19】:

                              回答: 上一秒:

                              select * from (select * from deletetable   where rownum <=2 order by rownum desc) where rownum <=1
                              

                              【讨论】:

                              • 当你不添加新东西时,请不要回答 4 岁的问题 :)
                              【解决方案20】:
                              select sal,ename from emp e where
                               2=(select count(distinct sal) from emp  where e.sal<=emp.sal) or
                               3=(select count(distinct sal) from emp  where e.sal<=emp.sal) or
                               4=(select count(distinct sal) from emp  where e.sal<=emp.sal) order by sal desc;
                              

                              【讨论】:

                                【解决方案21】:

                                我认为下面的查询将在 oracle sql 上完美运行...我自己测试过..

                                与此查询相关的信息:此查询使用名为 employeedepartment 的两个表,其中员工中的列名为:name(员工姓名)、dept_id(员工和部门通用)、@987654325 @

                                部门表中的列:dept_id(员工表也常见),dept_name

                                SELECT
                                  tab.dept_name,MIN(tab.salary) AS Second_Max_Sal FROM (
                                    SELECT e.name, e.salary, d.dept_name, dense_rank() over (partition BY  d.dept_name          ORDER BY e.salary)  AS   rank FROM department d JOIN employee e USING (dept_id) )  tab
                                 WHERE
                                   rank  BETWEEN 1 AND 2
                                 GROUP BY
                                   tab.dept_name
                                

                                谢谢

                                【讨论】:

                                  【解决方案22】:

                                  另一个使用分析函数的 Oracle:

                                  select distinct col1 --distinct is required to remove matching value of column
                                  from 
                                  ( select col1, dense_rank() over (order by col1 desc) rnk
                                    from tbl
                                  )
                                  where rnk = :b1
                                  

                                  【讨论】:

                                    【解决方案23】:
                                    Select min(fee) 
                                    from fl_FLFee 
                                    where fee in (Select top 4 Fee from fl_FLFee order by 1 desc)
                                    

                                    把第四个换成 N。

                                    【讨论】:

                                      【解决方案24】:

                                      你可以这样简化

                                      SELECT MIN(Sal) FROM TableName
                                      WHERE Sal IN
                                      (SELECT TOP 4 Sal FROM TableName ORDER BY Sal DESC)
                                      

                                      如果 Sal 包含重复值,则使用此

                                      SELECT MIN(Sal) FROM TableName
                                      WHERE Sal IN
                                      (SELECT distinct TOP 4 Sal FROM TableName ORDER BY Sal DESC)
                                      

                                      4 将是第 n 个值,它可以是任何最高值,例如 5 或 6 等。

                                      【讨论】:

                                        【解决方案25】:

                                        (表名=学生,列名=马克):

                                        select *
                                        from student 
                                        where mark=(select mark 
                                                    from(select row_number() over (order by mark desc) as t,
                                                         mark 
                                                         from student group by mark) as td 
                                                    where t=2)
                                        

                                        【讨论】:

                                          【解决方案26】:

                                          在 PostgreSQL 中,从 Employee 表中找到第 N 个最大的薪水。

                                          SELECT * FROM Employee WHERE salary in 
                                          (SELECT salary FROM Employee ORDER BY salary DESC LIMIT N) 
                                          ORDER BY salary ASC LIMIT 1;
                                          

                                          【讨论】:

                                            【解决方案27】:

                                            在 SQL Server 中查找特定列的第 N 个最大值的解决方案:

                                            员工表:

                                            销售表:

                                            员工表数据:

                                            ==========
                                            Id  name
                                            =========
                                            6   ARSHAD M
                                            7   Manu
                                            8   Shaji
                                            

                                            销售表数据:

                                            =================
                                            id  emp_id   amount
                                            =================
                                            1   6        500
                                            2   7        100
                                            3   8        100
                                            4   6        150
                                            5   7        130
                                            6   7        130
                                            7   7        330
                                            

                                            查询以找出销售额最高的员工/N排名最高的销售人员

                                            的详细信息
                                            select * from (select E.Id,E.name,SUM(S.amount) AS 'total_amount' from employee E INNER JOIN Sale S on E.Id=S.emp_id group by S.emp_id,E.Id,E.name ) AS T1 WHERE(0)=( select COUNT(DISTINCT(total_amount)) from(select E.Id,E.name,SUM(S.amount) AS 'total_amount' from employee E INNER JOIN Sale S on E.Id=S.emp_id group by S.emp_id,E.Id,E.name )AS T2 WHERE(T1.total_amount<T2.total_amount) );
                                            

                                            WHERE(0) 中将 0 替换为 n-1

                                            结果:

                                            ========================
                                            id  name    total_amount
                                            ========================
                                            7   Manu    690
                                            

                                            【讨论】:

                                              【解决方案28】:

                                              表员工

                                              salary 
                                              1256
                                              1256
                                              2563
                                              8546
                                              5645
                                              

                                              您通过此查询找到第二个最大值

                                              select salary 
                                              from employee 
                                              where salary=(select max(salary) 
                                                              from employee 
                                                              where salary <(select max(salary) from employee));
                                              

                                              您通过此查询找到第三个最大值

                                              select salary 
                                              from employee 
                                              where salary=(select max(salary) 
                                                              from employee 
                                                              where salary <(select max(salary) 
                                                                              from employee 
                                                                              where salary <(select max(salary)from employee)));
                                              

                                              【讨论】:

                                              • 最外层的选择是无关的。停止在第一个 max(salary) 会起作用。
                                              • 这个解决方案太疯狂了。
                                              猜你喜欢
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 2011-06-05
                                              • 2022-10-26
                                              相关资源
                                              最近更新 更多