【问题标题】:SQL query to find Nth highest salary from a salary tableSQL查询从工资表中查找第N个最高工资
【发布时间】:2012-07-31 02:25:26
【问题描述】:

有人帮我从 MYSQL 的薪水表中找出第 n 高薪

【问题讨论】:

标签: mysql


【解决方案1】:

我已经为此查询使用了过程

这里是getHighestSalary 过程,报告Employee 表中的第n 个最高薪水。如果没有第 n 高的薪水,查询应该报告 null。

首先,创建表

CREATE TABLE employee (
id INT AUTO_INCREMENT,
salary INT,
PRIMARY KEY (id) );

接下来,创建PROCEDURE

DELIMITER // 
 CREATE PROCEDURE getHighestSalary(emp_id int)
 BEGIN
    select ifnull((select salary from employee where id = emp_id order by salary desc), null) as getNthHighestSalary;
 END //
 DELIMITER ;

最后,使用 n 值调用 getHighestSalary 过程

call getHighestSalary(2); -- 200

【讨论】:

    【解决方案2】:
    +-------+--------+
    |  name | salary |
    +-------+--------+
    |   A   | 100    |
    |   B   | 200    |
    |   C   | 300    |
    |   D   | 400    |
    |   E   | 500    |
    |   F   | 500    |
    |   G   | 600    |
    +-------+--------+
    

    如果您只想选择第 N 个最高薪水,那么:

    SELECT DISTINCT salary FROM emp ORDER BY salary DESC LIMIT 1 OFFSET N-1;
    

    如果您想选择所有薪水最高的员工,那么:

    SELECT * FROM emp WHERE salary = (
       SELECT DISTINCT salary FROM emp ORDER BY salary DESC LIMIT 1 OFFSET N-1
    );
    

    【讨论】:

      【解决方案3】:

      这里我们可以为此创建MYSQL函数。 Employee 表中的第 n 个最高薪水。

      +----+--------+
      | Id | Salary |
      +----+--------+
      | 1  | 100    |
      | 2  | 200    |
      | 3  | 300    |
      +----+--------+
      

      例如,给定上面的 Employee 表,n = 2 的第 n 个最高薪水是 200。如果没有第 n 个最高薪水,则查询应返回 null。

      CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
      BEGIN
      DECLARE limitv INT;
          SET limitv = N - 1;
        RETURN (
            Select IFNULL(
              (select Distinct Salary from Employee order by Salary Desc limit limitv, 1),
               NULL
            ) as getNthHighestSalary
        );
      END
      
      【解决方案4】:

      要获得第 n 高的薪水,您需要先使用 ORDER BY 对数据进行排序,然后使用 LIMITOFFSET 选择第 n 高的记录。

      SELECT DISTINCT(salary) AS salary
      FROM tbl_salary
      ORDER BY salary DESC
      LIMIT 1 OFFSET (n - 1);
      

      【讨论】:

      • 您好 从 tbl_salary 中选择薪水 ORDER BY Salary DESC LIMIT 1 OFFSET n;这个查询没有得到正确的输出
      • 嘿,它应该是 LIMIT 1 OFFSET (n - 1)。试试看。
      • 您需要将 n 替换为 4 之类的数字以获得第四高的薪水,并且不要忘记标记并接受答案。
      • 是的,我以同样的方式做,我将 n 替换为一些整数,即 3 或 4,但它不带减号(-),如果我输入 4 而不是(4 -1),则错误未显示,但结果显示的是第三高而不是第四高。
      • 要获得第 4 高,您需要使用 LIMIT 1、3 或获取 4 之后的所有记录尝试 LIMIT 0、4。
      【解决方案5】:

      让表salaries包含

      +----------+--------+--------+
      | emp      | salary | deptno |
      +----------+--------+--------+
      | ep1      |     10 | dp1    |
      | ep2      |     20 | dp2    |
      | ep3      |     30 | dp2    |
      | ep4      |     40 | dp1    |
      | ep5      |     50 | dp1    |
      | ep6      |     60 | dp3    |
      | ep7      |     70 | dp3    |
      +----------+--------+--------+
      

      通过嵌套查询:(您可以分别将偏移量 0/1/2... 更改为第一、第二和第三...位置)

       select
            *
          from
            salaries as t1 
          where 
            t1.salary = (select 
                         salary
                       from 
                         salaries
                       where 
                       salaries.deptno = t1.deptno ORDER by salary desc limit 1 offset 1);
      

      或者可能是通过创建排名:(您可以在其中更改排名= 1/2/3...分别为第​​一、第二和第三...位置)

      SET @prev_value = NULL;
      SET @rank_count = 0;
      select * from 
      (SELECT
        s.*, 
        CASE 
            WHEN @prev_value = deptno THEN @rank_count := @rank_count + 1
            WHEN @prev_value := deptno THEN @rank_count := 1 
            ELSE @rank_count := 1 
        END as rank
      FROM salaries s
      ORDER BY deptno, salary desc) as t
      having t.rank = 2;
      

      【讨论】:

        【解决方案6】:

        试试这个解决方案。

        select SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT salary ORDER BY salary DESC),',',3),',',-1) from employees
        

        【讨论】:

        • 欢迎来到 SO。感谢您的回答。我想通过在代码行前面添加 4 个空格,它将被正确格式化为代码。让我给你一个提示:在你的代码旁边添加一些信息总是好的。谢谢。
        【解决方案7】:

        MySQL 查询从工资表中查找第 N 个最高工资(100% 正确)

        从 Employee ORDER BY Salary DESC LIMIT N-1,1 中选择 Salary;

        【讨论】:

          【解决方案8】:

          要获得第二高的薪水:

          SELECT   salary 
          FROM     [employees] 
          ORDER BY salary DESC 
          offset   1 rows 
          FETCH next 1 rows only
          

          要获得第 N 高的薪水:

          SELECT   salary 
          FROM     [employees] 
          ORDER BY salary DESC 
          offset   **n-1** rows 
          FETCH next 1 rows only
          

          【讨论】:

            【解决方案9】:
            SET @cnt=0; 
            SELECT s.* 
            FROM   (SELECT ( @cnt := @cnt + 1 ) AS rank, 
                           a.* 
                    FROM   one AS a 
                    ORDER  BY a.salary DESC) AS s 
            WHERE  s.rank = '3'; 
            

            【讨论】:

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

              【讨论】:

                【解决方案11】:

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

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

                【讨论】:

                • 您的查询将从表中返回第 (n+1) 条记录,它应该是 SELECT DISTINCT(Salary) FROM table ORDER BY Salary DESC LIMIT (n-1),1
                • 这只会返回一条记录。如果我们有 2 名或更多员工的薪水相同怎么办?
                • @Vish OP 只要求最高薪水,而不是最高薪水的员工。在这种情况下,您可以将其嵌套在 SELECT Employee FROM table WHERE Salary IN(已回答的查询)中。
                【解决方案12】:
                set @cnt=0;
                select s.* from (SELECT  (@cnt := @cnt + 1) AS rank,a.* FROM one as a  order by a.salary DESC) as s WHERE s.rank='3';
                

                =>这是第三高的薪水。 第 n 次替换 3 值。例如第五高:

                set @cnt=0;
                select s.* from (SELECT  (@cnt := @cnt + 1) AS rank,a.* FROM one as a  order by a.salary DESC) as s WHERE s.rank='5';
                

                【讨论】:

                  【解决方案13】:

                  这可以找到第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;
                  

                  【讨论】:

                  【解决方案14】:

                  这是工资表

                  SELECT  amount FROM  salary 
                  GROUP by amount
                  ORDER BY  amount DESC 
                  LIMIT n-1 , 1
                  

                  或者

                  SELECT DISTINCT amount
                  FROM  salary 
                  ORDER BY  amount DESC 
                  LIMIT n-1 , 1
                  

                  【讨论】:

                    【解决方案15】:

                    第四高薪:

                    select min(salary) from (select distinct Salary from hibernatepractice.employee e order by Salary desc limit 4) as e1;

                    第 n 高薪:

                    select min(salary) from (select distinct Salary from hibernatepractice.employee e order by Salary desc limit n) as e1;

                    【讨论】:

                      【解决方案16】:

                      获取第n高记录的查询如下:

                      SELECT 
                          *
                      FROM
                          (SELECT 
                              *
                          FROM
                              table_name
                          ORDER BY column_name ASC
                          LIMIT N) AS tbl
                      ORDER BY column_name DESC
                      LIMIT 1;
                      

                      简单易懂

                      【讨论】:

                      • ASC 和 DESC 应该相反。并在 tb1 的 select 语句中添加“distinct”,以防有一些联系。否则,我喜欢这个答案。
                      • 这在 Mysql 5.7 中不起作用,因为子查询中不允许 LIMIT。
                      【解决方案17】:

                      首先对所有记录进行排序,确实会消耗大量时间(想象一下,如果表包含数百万条记录)。 然而,诀窍是进行改进的线性搜索。

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

                      这里,一旦内部查询发现 n 个不同的薪水值大于外部查询的薪水,它就会将结果返回给外部查询。

                      Mysql 在http://dev.mysql.com/doc/refman/5.6/en/limit-optimization.html已经明确提到了这个优化

                      上面的查询也可以写成,

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

                      同样,如果查询就像在单个表上运行一样简单并且仅用于提供信息的目的,那么您可以限制最外层的查询返回 1 条记录,并通过将第 n 个最高薪水放在 where 子句中来运行单独的查询

                      感谢 Abishek Kulkarni 的解决方案,建议对此进行优化。

                      【讨论】:

                        【解决方案18】:

                        找到最高的薪水

                        select MAX(Salary) from Employee;
                        

                        找到第二高的薪水

                        查询-1

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

                        查询-2

                        select MAX(Salary) from Employee
                        WHERE Salary <> (select MAX(Salary) from Employee )
                        

                        找到第 n 高的薪水

                        查询-1

                        SELECT * /*This is the outer query part */
                        FROM Employee Emp1
                        WHERE (N-1) = ( /* Subquery starts here */
                        SELECT COUNT(DISTINCT(Emp2.Salary))
                        FROM Employee Emp2
                        WHERE Emp2.Salary > Emp1.Salary)
                        

                        查询-2

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

                        在 SQL Server 中使用 TOP 关键字排名第 n 高的薪水

                        SELECT TOP 1 Salary
                        FROM (
                              SELECT DISTINCT TOP N Salary
                              FROM Employee
                              ORDER BY Salary DESC
                              ) AS Emp
                        ORDER BY Salary
                        

                        在 MySQL 中查找第 n 个最高薪水

                        SELECT Salary FROM Employee 
                        ORDER BY Salary DESC LIMIT n-1,1
                        

                        在 SQL Server 中查找第 n 个最高薪水

                        SELECT Salary FROM Employee 
                        ORDER BY Salary DESC OFFSET N-1 ROW(S) 
                        FETCH FIRST ROW ONLY
                        

                        使用 rownum 在 Oracle 中查找第 n 个最高薪水

                        select * from (
                          select Emp.*, 
                        row_number() over (order by Salary DESC) rownumb 
                        from Employee Emp
                        )
                        where rownumb = n;  /*n is nth highest salary*/
                        

                        使用 RANK 在 Oracle 中查找第 n 个最高薪水

                        select * FROM (
                        select EmployeeID, Salary
                        ,rank() over (order by Salary DESC) ranking
                        from Employee
                        )
                        WHERE ranking = N;
                        

                        【讨论】:

                          【解决方案19】:

                          如果你想获得工资第三高的员工的所有记录,那么你可以使用这个sql查询:

                          表名:工资

                          select * from salary where salary = 
                          (select distinct salary from salary order by salary desc limit 2,1)
                          

                          【讨论】:

                          • 谁能解释一下为什么这个答案被否决了?
                          【解决方案20】:

                          如果您想从表中找到第 n 个薪水(这里的 n 应该是任何诸如第 1 或第 2 或第 15 高薪水之类的东西)

                          这是查找第 n 个薪水的查询:

                          SELECT DISTINCT Salary FROM tblemployee ORDER BY Salary DESC LIMIT 1 OFFSET (n-1)
                          

                          如果你想找到第8高的薪水,查询应该是:

                          SELECT DISTINCT Salary FROM tblemployee ORDER BY Salary DESC LIMIT 1 OFFSET 7
                          

                          注意:OFFSET从第0个位置开始,因此这里使用N-1规则

                          【讨论】:

                          • 我在这里找到的最佳解决方案是您的!不那么凌乱,没有子查询。只有您必须更改此SELECT DISTINCT Salary FROM tblemployee ORDER BY Salary DESC LIMIT 1 OFFSET (n -1),因为您还提到偏移量从 0 开始,您应该避免这样做
                          • 谢谢!!提到偏移量从 0 开始,之前很困惑:)
                          【解决方案21】:
                          SELECT * FROM Employee Emp1 
                          WHERE (N-1) = ( 
                              SELECT COUNT(DISTINCT(Emp2.Salary)) 
                              FROM  Employee Emp2 
                              WHERE Emp2.Salary > Emp1.Salary)
                          

                          对于外部查询处理的每条记录,都会执行内部查询,并返回有多少条记录的工资低于当前工资。如果您正在寻找第二高的薪水,那么一旦内部查询返回 N-1,您的查询就会停止。

                          【讨论】:

                          • 这是第 N 高薪水的完美答案,并且此查询返回所有具有相同薪水的员工。
                          【解决方案22】:
                          SELECT * FROM employe e1 WHERE n-1 = ( SELECT COUNT(DISTINCT(e2.salary)) FROM employe e2 WHERE e2.salary > e1.salary) 
                          
                              Where n = highest number of salary like 1,2,3
                          

                          【讨论】:

                            【解决方案23】:

                            试试这个找到第五高的薪水-

                            SELECT DISTINCT(column name) FROM table ORDER BY (column name) desc LIMIT 4,1
                            

                            第n个薪水-

                            SELECT DISTINCT(column name) FROM table ORDER BY (column name) desc LIMIT n-1,1
                            

                            我在phpmyadmin面板上试过了..

                            【讨论】:

                              【解决方案24】:
                              SELECT DISTINCT(column_name)
                                FROM table_name 
                                ORDER BY column_name DESC limit N-1,1;
                              

                              其中 N 代表第 n 高薪..

                              第三高的薪水:

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

                              【讨论】:

                                【解决方案25】:

                                试试这个:

                                select MIN(sal) from salary where sal in 
                                 (select sal from salary order by sal desc limit 9)
                                

                                【讨论】:

                                • 子查询不支持mysql中的限制操作
                                【解决方案26】:

                                如果想指定第n高,可以使用排名方法。

                                要获得第三高,请使用

                                SELECT * FROM
                                (SELECT @rank := @rank + 1 AS rank, salary
                                FROM   tbl,(SELECT @rank := 0) r 
                                order by salary desc ) m
                                WHERE rank=3
                                

                                【讨论】:

                                • 我不认为它会起作用..'where 子句'中的未知列'rank'。
                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 2013-04-20
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2020-08-21
                                相关资源
                                最近更新 更多