【问题标题】:Find max and second max salary for a employee table MySQL查找员工表 MySQL 的最大和第二个最大薪水
【发布时间】:2014-02-26 12:10:02
【问题描述】:

假设您有一个名为 Employee 的简单数据库表,它有 2 列名为 Employee ID 和 Salary:

  Employee
  Employee ID    Salary
   3            200
   4            800
   7            450

我想写一个查询 select max(salary) as max_salary, 2nd_max_salary from employee

那么它应该返回

  max_salary   2nd_max_salary
   800             450

我知道如何找到第二高的薪水

   SELECT MAX(Salary) FROM Employee
  WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )

或者找到第n个

  SELECT FROM Employee Emp1 WHERE (N-1) = ( SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2
  WHERE Emp2.Salary > Emp1.Salary)

但我无法弄清楚如何将这 2 个结果加入到所需的结果中

【问题讨论】:

  • 显而易见的后续问题是,如果该样本数据中有第 4 行的薪水为 800……您想要的结果是什么?应该是800,800,因为这是你最高的两个薪水?还是应该是800,450,因为这是你的两个最高独特薪水?
  • 上面给出了第二大的值,假设如果我在第二大有多个值,满足上述要求的查询修改将是什么

标签: mysql sql


【解决方案1】:

您可以只运行 2 个查询作为内部查询以返回 2 列:

select
  (SELECT MAX(Salary) FROM Employee) maxsalary,
  (SELECT MAX(Salary) FROM Employee
  WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )) as [2nd_max_salary]

SQL Fiddle Demo

【讨论】:

  • 如果是临时表怎么办?
  • 应该没什么区别。
  • 它确实会有所不同,您不能在查询中两次引用临时表:)
  • CTE 是什么意思?您可以阅读我在这里所说的文档:dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html
  • @Sohaib 抱歉,我忘记了这个问题是关于 MySQL 的。无论如何,我不确定,最好单独问一个问题。
【解决方案2】:

不是一个很好的查询,但是:

SELECT * from (
    SELECT max(Salary) from Employee
    ) as a
LEFT OUTER JOIN 
    (SELECT MAX(Salary) FROM Employee
        WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )) as b
ON 1=1

【讨论】:

    【解决方案3】:

    你可以像这个例子那样写2个子查询

    SELECT (select max(Salary) from Employee) as max_id, 
         (select Salary from Employee order by Salary desc limit 1,1) as max_2nd 
    

    【讨论】:

      【解决方案4】:

      这样试试

      SELECT (select max(Salary) from Employee) as MAXinmum),(max(salary) FROM Employee WHERE salary NOT IN (SELECT max(salary)) FROM Employee);
      

      (或)

      试试这个,n 将是您想要返回的第 n 个项目

       SELECT DISTINCT(Salary) FROM table ORDER BY Salary DESC LIMIT n,1
      

      你的情况

       SELECT DISTINCT(column_name) FROM table_name ORDER BY column_name DESC limit 2,1;
      

      【讨论】:

      • 您的第二个解决方案似乎运行良好。但是您认为您在此处显示的这个简单查询存在什么问题。我将子查询视为其他解决方案
      • limit 2,1 将失败 2 条记录,这些记录具有第二高的薪水
      【解决方案5】:

      对于唯一的薪水(即第一个不能与第二个相同):

      SELECT
        MAX( s.salary ) AS max_salary,
        (SELECT
           MAX( salary ) 
         FROM salaries
         WHERE salary <> MAX( s.salary ) 
         ORDER BY salary DESC 
         LIMIT 1
        ) AS 2nd_max_salary
      FROM salaries s
      

      还因为这是解决这个问题的一种不必要的方法(谁能说 2 行而不是 2 列,哈哈?)

      【讨论】:

        【解决方案6】:

        我认为oracle中的简单方法是这样的:

        SELECT Salary FROM
        (SELECT DISTINCT Salary FROM Employee ORDER BY Salary desc)
        WHERE ROWNUM <= 2;
        

        【讨论】:

          【解决方案7】:

          试试

          SELECT 
          
             SUBSTRING( GROUP_CONCAT( Salary ), 1 , LOCATE(",", GROUP_CONCAT( Salary ) ) -1 ) AS max_salary,
          
             SUBSTRING( GROUP_CONCAT( Salary ), LOCATE(",", GROUP_CONCAT( Salary ) ) +1 ) AS second_max_salary
          
          FROM 
             (
               SELECT Salary FROM `Employee` ORDER BY Salary DESC LIMIT 0,2
             ) a
          

          演示here

          【讨论】:

            【解决方案8】:

            第二高的薪水,这个适合我:

            SELECT salary
            FROM employee
            WHERE salary 
            NOT IN (
            SELECT MAX( salary ) 
            FROM employee
            ORDER BY salary DESC
            )
            LIMIT 1
            

            【讨论】:

              【解决方案9】:
              $q="select * from info order by salary desc limit 1,0"; // display highest 2 salary
              

              $q="select * from info order by salary desc limit 1,0"; // display 2nd highest salary
              

              【讨论】:

              • 其实那是完全错误的。前 2 位是 LIMIT 0,2,显示 2 最高的是 `LIMIT 1,1
              【解决方案10】:

              这是一个很棒的查询来找到第 n 个最大值: 例如:-

              1. 您要查找薪金第 8 行的薪水,只需将索引值更改为 8。

              2. 假设您有 100 行的薪水。现在您要查找第 90 行的最高工资。只需将索引值更改为 90。

                set @n:=0;
                select * from (select *, (@n:=@n+1) as indexed from employee order by Salary desc)t where t.indexed = 1;
                

              【讨论】:

                【解决方案11】:

                最佳和最简单的解决方案:-

                 SELECT
                    max(salary)
                FROM
                    salary
                WHERE
                    salary < (
                        SELECT
                            max(salary)
                        FROM
                            salary
                    );
                

                【讨论】:

                  【解决方案12】:
                  `select max(salary) as first, (select salary from employee order by salary desc limit 1, 1) as second from employee limit 1`
                  

                  对于最高薪水,我们可以简单地使用 max 函数,但第二个最高薪水我们应该使用子查询。在子查询中,我们可以使用 where 条件来检查第二个最高薪水,或者我们可以简单地使用 limit。

                  【讨论】:

                    【解决方案13】:

                    使用公用表表达式

                    With cte as (
                     SELECT 
                       ROW_NUMBER() Over (Order By Salary Desc) RowNumber, 
                       Max(Salary) Salary 
                     FROM
                         Employee
                     Group By Salary
                    )
                    
                    Select * from cte where RowNumber = 2
                    

                    【讨论】:

                      【解决方案14】:

                      这将是最简单的代码格式:

                       select max(salary) as 'max_salary',
                       (select salary from employee order by salary desc limit 1,1) as 
                       '2nd_max_salary'
                       from employee;
                      

                      查找第 n 高的薪水,语法是:

                      select max(salary) as 'max_salary',
                      (select salary from employee order by salary desc limit n-1,1) as 
                      'nth_max_salary'
                      from employee;
                      

                      【讨论】:

                        【解决方案15】:

                        没有嵌套查询

                        select max(e.salary) as max_salary, max(e1.salary) as 2nd_max_salary 
                        from employee as e
                        left join employee as e1 on e.salary != e1.salary
                        group by e.salary desc limit 1;
                        

                        【讨论】:

                          【解决方案16】:

                          这里根据您的要求更改n 值:

                          SELECT top 1 amount 
                          FROM ( 
                              SELECT DISTINCT top n amount 
                              FROM payment 
                              ORDER BY amount DESC ) AS temp 
                          ORDER BY amount
                          

                          【讨论】:

                            【解决方案17】:

                            这应该是一样的:

                            SELECT MAX(salary) max_salary,
                              (SELECT MAX(salary)
                               FROM Employee
                               WHERE salary NOT IN
                                   (SELECT MAX(salary)
                                    FROM Employee)) 2nd_max_salary
                            FROM Employee
                            

                            【讨论】:

                              【解决方案18】:

                              试试下面的查询,正在为我找到第 N 高的薪水。 只需将您的号码替换为 nth_No

                              Select DISTINCT TOP 1 salary
                              from 
                              (Select DISTINCT TOP *nth_No* salary
                              from Employee
                              ORDER BY Salary DESC)
                              Result
                              ORDER BY Salary
                              

                              【讨论】:

                                【解决方案19】:

                                如果我们想找到获得第三高薪水的员工,请执行此查询

                                SELECT a.employeeid, 
                                       a.salary 
                                FROM  (SELECT employeeid, 
                                              salary, 
                                              Dense_rank() 
                                                OVER( 
                                                  ORDER BY salary) AS n 
                                       FROM   employee) AS a 
                                WHERE  n = 3 
                                

                                你想要什么

                                【讨论】:

                                  【解决方案20】:

                                  您可以在任何您喜欢的数据库中编写 SQL 查询,例如MySQLMicrosoft SQL ServerOracle。您还可以使用数据库特定功能,例如TOP、LIMIT 或 ROW_NUMBER 来编写 SQL 查询,但您还必须提供适用于所有数据库的通用解决方案。事实上,有几种方法可以找到第二高的薪水,你必须知道其中的一些,例如在 MySQL 中不使用 LIMIT 关键字,在 SQL Server 中不使用 TOP,在 Oracle 中不使用 RANKROWNUM .

                                  通用 SQL 查询:

                                  SELECT
                                      MAX(salary)
                                  FROM
                                      Employee
                                  WHERE
                                      Salary NOT IN (
                                          SELECT
                                              Max(Salary)
                                          FROM
                                              Employee
                                      );
                                  

                                  另一个使用子查询而不是 NOT IN 子句的解决方案。它使用&lt; 运算符。

                                  SELECT
                                      MAX(Salary)
                                  FROM
                                      Employee
                                  WHERE
                                      Salary < (
                                          SELECT
                                              Max(Salary)
                                          FROM
                                              Employee
                                      );
                                  

                                  【讨论】:

                                    【解决方案21】:

                                    这可以找到第n个最大数

                                    SELECT 
                                        TOP 1 * from (SELECT TOP  nth_largest_no * FROM Products Order by price desc) ORDER BY price asc;
                                    

                                    对于第五大数字

                                    SELECT 
                                      TOP 1 *  from (SELECT TOP  5 * FROM Products Order by price desc) ORDER BY price asc;
                                    

                                    【讨论】:

                                      【解决方案22】:
                                      select 
                                          e.salary
                                              from(
                                                 SELECT * FROM 
                                                 Employee 
                                                   group by salary
                                                   order by salary desc
                                                   limit 2
                                                ) e
                                           order by salary asc
                                           limit 1;
                                      

                                      【讨论】:

                                      • 第二大薪水
                                      【解决方案23】:

                                      查找员工的最高工资

                                      SELECT MAX(Salary) FROM Employee
                                      

                                      找到第二高的薪水

                                      SELECT MAX(Salary) FROM Employee 
                                      Where Salary Not In (Select MAX(Salary) FROM Employee)
                                      

                                      SELECT  MAX(Salary) FROM Employee
                                      WHERE Salary <> (SELECT MAX(Salary) FROM Employee )
                                      

                                      【讨论】:

                                      • 使用内部查询不好。它只会增加执行时间。
                                      【解决方案24】:

                                      这是另一个使用子查询的解决方案,但它使用 而不是 IN 子句

                                      SELECT MAX(Salary) From Employees WHERE Salary < ( SELECT Max(Salary) FROM Employees);
                                      

                                      【讨论】:

                                        【解决方案25】:
                                        select * from emp where sal =(select max(sal) from emp where eno in(select eno from emp where sal <(select max(sal)from emp )));
                                        

                                        试试上面的代码....

                                        如果您想要第三条最大记录,则在最后一个查询的括号内添加另一个嵌套查询“select max(sal)from emp”,并在其前面给出小于运算符。

                                        【讨论】:

                                          【解决方案26】:

                                          我认为,这是找到MAX 和第二个MAX Salary 的最简单方法。您可以尝试这种方式。

                                          SELECT MAX(Salary) FROM Employee; -- For Maximum Salary.
                                          
                                          SELECT MAX(Salary) FROM Employee WHERE Salary < (SELECT MAX(Salary) FROM Employee); -- For Second Maximum Salary
                                          

                                          【讨论】:

                                            【解决方案27】:
                                            select * from
                                              Employees where Sal >=
                                              (SELECT
                                                max(Sal)
                                            FROM
                                                Employees
                                            WHERE
                                                Sal < (
                                                    SELECT
                                                        max(Sal)
                                                    FROM
                                                        Employees; 
                                                ));
                                            

                                            【讨论】:

                                            • 这不是解决方案。 ` 2nd_max_salary from employee` 应该是
                                            • 你能发表一下为什么你认为这是一个解决方案
                                            【解决方案28】:

                                            获取第二个最高薪水和第n个薪水的最简单方法

                                            select 
                                             DISTINCT(salary) 
                                            from employee 
                                             order by salary desc 
                                            limit 1,1
                                            

                                            注意:

                                            limit 0,1  - Top max salary
                                            
                                            limit 1,1  - Second max salary
                                            
                                            limit 2,1  - Third max salary
                                            
                                            limit 3,1  - Fourth max salary
                                            

                                            【讨论】:

                                              【解决方案29】:

                                              最高工资:

                                              select max(salary) from tbl_employee <br><br>
                                              

                                              第二个最高工资:

                                              select max(salary) from tbl_employee where salary < ( select max(salary) from tbl_employee);
                                              

                                              【讨论】:

                                                【解决方案30】:

                                                此解决方案将给出所有薪水第二高的员工姓名和薪水

                                                SELECT name, salary
                                                FROM employee
                                                WHERE salary = (
                                                    SELECT 
                                                        salary
                                                    FROM employee AS emp
                                                    ORDER BY salary DESC
                                                    LIMIT 1,1
                                                );
                                                

                                                【讨论】:

                                                  猜你喜欢
                                                  • 1970-01-01
                                                  • 1970-01-01
                                                  • 2011-01-10
                                                  • 2011-01-30
                                                  • 2019-11-02
                                                  • 1970-01-01
                                                  • 1970-01-01
                                                  • 2019-05-04
                                                  • 1970-01-01
                                                  相关资源
                                                  最近更新 更多