【问题标题】:Get the second highest value in a MySQL table获取 MySQL 表中的第二高值
【发布时间】:2011-07-18 16:02:47
【问题描述】:

我有一张这样定义的员工和工资表:

"name" (type: VARCHAR)
"salary" (type: INTEGER)

我可以使用什么查询来获得该表中第二高的薪水?

【问题讨论】:

  • 如果您有 2 个或多个名字的最高或第二高薪水怎么办?
  • @Pentium - 我也有同样的疑惑......相应地回答了

标签: mysql


【解决方案1】:
SELECT SALARY 
FROM (SELECT * 
      FROM EMPLOYEE 
      ORDER BY SALARY 
      DESC LIMIT ***2***) AS TOP_SALARY 
ORDER BY SALARY ASC 
LIMIT 1

【讨论】:

    【解决方案2】:

    看来我回答这个问题已经晚了。这一个班轮如何获得相同的输出?

    SELECT DISTINCT salary FROM employees ORDER BY salary DESC LIMIT 1,1 ;
    

    小提琴样例:https://www.db-fiddle.com/f/v4gZUMFbuYorB27AH9yBKy/0

    【讨论】:

    • DISTINCT 在这里是多余的,因为限制已经设置为 1。
    • DISTINCT 不是多余的。这是必需的,因为可能有两个相似的薪水一个接一个。
    • 即使我们有重复的薪水,我们也只会得到一行,因为 limit 被定义为 1。所以 limit 将大小设置为一行,所以 DISTINCT 变得多余.
    • 我想你才刚刚开始,看看这个示例小提琴:db-fiddle.com/f/v4gZUMFbuYorB27AH9yBKy/0 第二个查询“没有DISTINCT”返回错误值。
    • 现在明白了。非常感谢您的提琴和解释。
    【解决方案3】:
    SELECT name, salary 
    FROM employees 
    where
     salary = (SELECT (salary) FROM employees GROUP BY salary DESC LIMIT 1,1)
    

    【讨论】:

      【解决方案4】:

      要获得第二高的值:

      SELECT `salary` FROM `employees` ORDER BY `salary` DESC LIMIT 1, 1;
      

      【讨论】:

        【解决方案5】:

        试试这个:

        SELECT DISTINCT(`salary`)
            FROM `employee`
        
            ORDER BY `salary` DEC
            LIMIT 1,1
        

        【讨论】:

          【解决方案6】:
          SELECT name, salary
          FROM employees
          order by salary desc limit 1,1
          

          这个查询应该可以完成您的工作。 首先,我们按降序对表格进行排序,因此薪水最高的人排在最前面,第二高的人排在第二位。现在limit a,b 表示跳过开始的a 元素,然后打印下一个b 元素。所以在这种情况下你应该使用limit 1,1

          希望这会有所帮助。

          【讨论】:

            【解决方案7】:

            要获得第二高的薪水,只需使用以下查询

            SELECT salary FROM employees
            ORDER BY salary DESC LIMIT 1,1;
            

            【讨论】:

              【解决方案8】:

              试试这个:

              Proc sql;
                select employee, salary
                from (select * from test having salary < max(salary)) 
                 having salary = max(salary)
                ;
              Quit;
              

              【讨论】:

              • 这是一个非常令人困惑的答案 - 你能澄清一下吗?
              • 对于第二个最大值,使用嵌套查询从表中删除最大值。然后将嵌套查询生成的表馈送到外部查询,其中标记应等于 max(marks),注意按语句添加分组以查看部门明智的第二个最大值。
              • 字段名称甚至与问题中给出的名称不匹配。这里可能有一个有用的答案,但如果有,那么 OP 应该 edit 回答 (a) 清理示例代码以反映给定的问题和 (b) 合并当前仅在评论中的解释性文本.
              • 对不起,我希望讨论逻辑会奏效。无论如何,我已经在这里发布了代码。它返回表中第二高的薪水。
              【解决方案9】:

              使用以下查询获得第二、第三、第四……第 N ​​高薪

              SELECT MIN(salary) from employees WHERE salary IN( SELECT TOP N salary FROM employees ORDER BY salary DESC)
              

              用你的数字替换 N,即 N=2 表示第二高的薪水, N=3 表示第三高的薪水,依此类推。所以对于第二高的薪水使用

              SELECT MIN(salary) from employees WHERE salary IN( SELECT TOP 2 salary FROM employees ORDER BY salary DESC)
              

              【讨论】:

                【解决方案10】:

                您可以使用下面提到的查询

                SELECT emp.name, emp.salary 
                FROM employees emp 
                WHERE 2 = (SELECT COUNT(DISTINCT salary) 
                           FROM employees 
                           WHERE emp.salary<=salary
                          );
                

                您可以将 2 更改为您想要的最高记录。

                【讨论】:

                  【解决方案11】:
                  SELECT name,salary FROM employee
                  WHERE salary = (SELECT DISTINCT(salary) FROM employee ORDER BY salary DESC LIMIT 1,1) ORDER BY name
                  

                  【讨论】:

                    【解决方案12】:
                    SELECT DISTINCT Salary
                    FROM emp
                    ORDER BY salary DESC
                    LIMIT 1 , 1
                    

                    这个查询也会给出重复记录的第二高薪水。

                    【讨论】:

                      【解决方案13】:

                      这是一个说明关系的问题。

                      Name    Salary
                      Jim       6
                      Foo       5
                      Bar       5
                      Steve     4
                      
                      SELECT name, salary
                      FROM employees
                      WHERE salary = (SELECT MAX(salary) FROM employees WHERE salary < (SELECT MAX(salary) FROM employees))
                      
                      Result --> Bar 5, Foo 5
                      

                      编辑: 我接受了 Manoj 的第二篇文章,对其进行了调整,使其更具可读性。对我来说 n-1 并不直观;但是,使用我想要的值,2=2nd、3=3rd 等等。

                      /* looking for 2nd highest salary -- notice the '=2' */
                      SELECT name,salary FROM employees
                      WHERE salary = (SELECT DISTINCT(salary) FROM employees as e1
                      WHERE (SELECT COUNT(DISTINCT(salary))=2 FROM employees as e2
                      WHERE e1.salary <= e2.salary)) ORDER BY name
                      
                      Result --> Bar 5, Foo 5
                      

                      【讨论】:

                      • 如果我想从我的表中选择第三高我该怎么办...提前谢谢
                      • SELECT 姓名、工资 FROM 雇员 WHERE 工资 = (SELECT MAX(salary) FROM 雇员 WHERE 工资
                      • Wow.Amazing 这个查询给出了准确的结果
                      【解决方案14】:
                      SELECT username, salary
                      FROM tblname
                      GROUP by salary
                      ORDER by salary desc
                      LIMIT 0,1 ;
                      

                      【讨论】:

                        【解决方案15】:
                        with alias as
                        (
                        select name,salary,row_number() over(order by salary desc ) as rn from employees
                        )
                        select name,salary from alias where rn=n--n being the nth highest salary
                        

                        【讨论】:

                          【解决方案16】:

                          要获得第 *N* 个最高值,最好使用此解决方案:

                          SELECT * FROM `employees`  WHERE salary =
                                   (SELECT DISTINCT(salary) FROM `employees` 
                                   ORDER BY salary DESC LIMIT {N-1},1);
                          

                          或者你可以试试:

                          SELECT * FROM `employees` e1 WHERE 
                                  (N-1) = (SELECT COUNT(DISTINCT(salary)) 
                                  FROM `employees` e2 
                                  WHERE e1.salary < e2.salary ); 
                          

                          N=2 为第二高 N=3 为第三高,依此类推。

                          【讨论】:

                            【解决方案17】:
                            SELECT MIN(id) as id FROM students where id>(SELECT MIN(id) FROM students);
                            

                            【讨论】:

                              【解决方案18】:
                              SELECT name, salary
                              FROM EMPLOYEES
                              WHERE salary = ( 
                              SELECT DISTINCT salary
                              FROM EMPLOYEES
                              ORDER BY salary DESC 
                              LIMIT 1 , 1 ) 
                              

                              【讨论】:

                                【解决方案19】:

                                第二高薪水的直接答案

                                SELECT name, salary
                                FROM employees ORDER BY `employees`.`salary` DESC LIMIT 1 , 1
                                

                                另一个有趣的解决方案

                                SELECT salary 
                                FROM emp 
                                WHERE salary = (SELECT DISTINCT(salary) 
                                                FROM emp as e1 
                                                WHERE (n) = (SELECT COUNT(DISTINCT(salary)) 
                                                             FROM emp as e2 
                                                             WHERE e1.salary <= e2.salary))
                                

                                【讨论】:

                                • 为什么会获得投票?该 SELECT 语句只返回一个值:TOP Salary。问题是找到第二高的薪水。
                                • 这个答案得到了投票,因为第一个解决方案是最直接的解决方案。请参阅MySQL docs on SELECT 中有关“偏移量”的部分。 “LIMIT”后面的第一个数字是使用逗号时的偏移量。偏移量是零索引的。因此,此查询选择一行,从第二高开始。 (不过,这不包括关系)
                                • @Jon - 检查他的编辑。它在 6 月份所做的事情与 12 月份所做的事情不同。
                                • 实际上,您的第一个查询不会得到准确的结果。考虑一名以上薪水第二高的员工的情况。您的查询将只返回一行。
                                • 如果超过 1 名员工具有相同的最高薪水或相同的第二高薪水,则第一个查询将不起作用。
                                【解决方案20】:
                                SELECT MAX(salary) salary
                                FROM tbl
                                WHERE salary <
                                  (SELECT MAX(salary)
                                   FROM tbl);
                                

                                【讨论】:

                                  【解决方案21】:

                                  第二高的薪水

                                   select max(salary) from salary where salary not in (select top 1 salary from salary order by salary desc)
                                  

                                  第三高的薪水

                                   select max(salary) from salary where salary not in (select top 2 salary from salary order by salary desc)
                                  

                                  等等……

                                  【讨论】:

                                    【解决方案22】:

                                    找到另一个有趣的解决方案

                                    SELECT salary 
                                    FROM emp 
                                    WHERE salary = (SELECT DISTINCT(salary) 
                                                    FROM emp as e1 
                                                    WHERE (n) = (SELECT COUNT(DISTINCT(salary)) 
                                                                 FROM emp as e2 
                                                                 WHERE e1.salary <= e2.salary))
                                    

                                    对不起。忘记写了。 n是你想要的第n个薪水。

                                    【讨论】:

                                    • 从 emp 中选择薪水 WHERE 薪水 = (SELECT DISTINCT(salary) FROM emp as e1 WHERE (n) = (SELECT COUNT(DISTINCT(salary)) FROM emp as e2 WHERE e1.salary
                                    【解决方案23】:

                                    简单的解决方案如下查询:

                                    select max(salary) as salary from employees where salary<(select max(salary) from employees);
                                    

                                    【讨论】:

                                      【解决方案24】:

                                      试试这个可以获得第n个最高薪水

                                      我在发布之前已经尝试过,效果很好

                                      例如。找到第 10 个最高工资替换 limit 9,1;

                                      mysql&gt; select name,salary from emp group by salary desc limit n-1,1;

                                      【讨论】:

                                        【解决方案25】:

                                        倒数第二个:

                                        SELECT name, salary
                                            FROM employee 
                                            ORDER BY salary DESC
                                            LIMIT 1 , 1
                                        

                                        第三个:

                                        SELECT name, salary
                                            FROM employee 
                                            ORDER BY salary DESC
                                            LIMIT 2 , 1
                                        

                                        【讨论】:

                                          【解决方案26】:

                                          简单的解决方案

                                          SELECT * FROM TBLNAME ORDER BY COLNAME ASC LIMIT (n - x), 1
                                          

                                          注意:n = 列中的总记录数

                                            x = value 2nd, 3rd, 4th highest etc
                                          

                                          例如

                                          //to find employee with 7th highest salary
                                          
                                          n = 100
                                          x = 7
                                          
                                          SELECT * FROM tbl_employee ORDER BY salary ASC LIMIT 93, 1
                                          

                                          希望对你有帮助

                                          【讨论】:

                                            【解决方案27】:

                                            显示具有第二大标记值的记录:

                                            SELECT username, mark
                                            FROM tbl_one
                                            WHERE mark = (
                                                SELECT DISTINCT mark
                                                FROM tbl_one
                                                ORDER by mark desc
                                                LIMIT 1,1
                                            ); 
                                            

                                            【讨论】:

                                              【解决方案28】:
                                              create table svalue (
                                              name varchar(5),
                                              value int
                                              ) engine = myisam;
                                              
                                              insert into svalue value ('aaa',30),('bbb',10),('ccc',30),('ddd',20);
                                              
                                              select * from svalue where value = (
                                              select value 
                                              from svalue
                                              group by value
                                              order by  value desc limit 1,1)
                                              

                                              【讨论】:

                                                猜你喜欢
                                                • 2013-09-15
                                                • 1970-01-01
                                                • 2013-10-31
                                                • 2018-06-20
                                                • 2016-12-28
                                                • 2019-07-01
                                                • 2020-04-06
                                                • 1970-01-01
                                                • 2020-12-31
                                                相关资源
                                                最近更新 更多