简体   繁体   English

SQL查询从工资表中查找第N个最高工资

[英]SQL query to find Nth highest salary from a salary table

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

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

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

If you want to find nth Salary from a table (here n should be any thing like 1st or 2nd or 15th highest Salaries)如果你想从一个表中找到第 n 个薪水(这里 n 应该是任何像 1st、2nd 或 15th 最高薪水的东西)

This is the Query for to find nth Salary:这是查找第 n 个薪水的查询:

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

If you want to find 8th highest salary, query should be :如果你想找到第 8 高的薪水,查询应该是:

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

Note: OFFSET starts from 0th position, and hence use N-1 rule here注意: OFFSET 从第 0 个位置开始,因此这里使用 N-1 规则

To get nth highest salary you need to first sort data by using ORDER BY and then select the nth highest record using LIMIT with OFFSET .要获得第 n 个最高薪水,您需要首先使用ORDER BY对数据进行排序,然后使用LIMITOFFSET选择第 n 个最高记录。

SELECT DISTINCT(salary) AS salary
FROM tbl_salary
ORDER BY salary DESC
LIMIT 1 OFFSET (n - 1);
SELECT * FROM Employee Emp1 
WHERE (N-1) = ( 
    SELECT COUNT(DISTINCT(Emp2.Salary)) 
    FROM  Employee Emp2 
    WHERE Emp2.Salary > Emp1.Salary)

For each record processed by outer query, inner query will be executed and will return how many records has records has salary less than the current salary.对于外部查询处理的每条记录,将执行内部查询,并返回有多少条记录的工资低于当前工资。 If you are looking for second highest salary then your query will stop as soon as inner query will return N-1.如果您正在寻找第二高的薪水,那么只要内部查询返回 N-1,您的查询就会停止。

finding the highest salary寻找最高薪水

select MAX(Salary) from Employee;

finding the 2nd highest salary找到第二高的工资

Query-1查询 1

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

Query-2查询 2

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

finding the nth highest salary找到第 n 个最高工资

Query-1查询 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)

Query-2查询 2

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

nth highest salary using the TOP keyword in SQL Server在 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

Find the nth highest salary in MySQL在 MySQL 中查找第 n 个最高薪水

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

Find the nth highest salary in SQL Server在 SQL Server 中查找第 n 个最高薪水

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

Find the nth highest salary in Oracle using rownum使用 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*/

Find the nth highest salary in Oracle using RANK使用 RANK 在 Oracle 中查找第 n 个最高薪水

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

try this:试试这个:

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

Here we can create the MYSQL function for this.在这里我们可以为此创建 MYSQL 函数。 nth highest salary from the Employee table. Employee 表中的第 n 个最高工资。

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

For example, given the above Employee table, the nth highest salary where n = 2 is 200. If there is no nth highest salary, then the query should return null.例如,给定上面的 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

if wanna specified nth highest,could use rank method.如果要指定第 n 个最高值,可以使用排名方法。

To get the third highest, use要获得第三高,请使用

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

Try this one for finding 5th highest salary-试试这个找到第五高的工资-

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

for nth salary-第 n 个薪水-

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

I have tried it on phpmyadmin panel..我已经在 phpmyadmin 面板上试过了..

+-------+--------+
|  name | salary |
+-------+--------+
|   A   | 100    |
|   B   | 200    |
|   C   | 300    |
|   D   | 400    |
|   E   | 500    |
|   F   | 500    |
|   G   | 600    |
+-------+--------+

IF YOU WANT TO SELECT ONLY Nth HIGHEST SALARY THEN:如果您只想选择第 N 个最高薪水,那么:

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

IF YOU WANT TO SELECT ALL EMPLOYEE WHO GETTING Nth HIGHEST SALARY THEN:如果您想选择所有获得第 N 个最高薪水的员工,那么:

SELECT * FROM emp WHERE salary = (
   SELECT DISTINCT salary FROM emp ORDER BY salary DESC LIMIT 1 OFFSET N-1
);
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

Sorting all the records first, do consume a lot of time (Imagine if the table contains millions of records).首先对所有记录进行排序,确实会消耗大量时间(想象一下,如果该表包含数百万条记录)。 However, the trick is to do an improved linear-search.然而,诀窍是进行改进的线性搜索。

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

Here, as soon as inner query finds n distinct salary values greater than outer query's salary, it returns the result to outer query.在这里,只要内部查询发现 n 个不同的工资值大于外部查询的工资,它就会将结果返回给外部查询。

Mysql have clearly mentioned about this optimization at http://dev.mysql.com/doc/refman/5.6/en/limit-optimization.html Mysql 在http://dev.mysql.com/doc/refman/5.6/en/limit-optimization.html明确提到了这个优化

The above query can also be written as,上面的查询也可以写成,

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

Again, if the queries are as simple as just running on single table and needed for informational purposes only, then you could limit the outermost query to return 1 record and run a separate query by placing the nth highest salary in where clause同样,如果查询就像在单个表上运行一样简单并且仅用于提供信息,那么您可以将最外层的查询限制为返回 1 条记录,并通过将第 n 个最高工资放在 where 子句中来运行单独的查询

Thanks to Abishek Kulkarni's solution, on which this optimization is suggested.感谢 Abishek Kulkarni 的解决方案,建议对其进行优化。

select distinct(column_name) from table_name order by column_name desc limit (n-1),1;

MySQL query to find Nth highest salary from a salary table (100% true) MySQL 查询从工资表中查找第 N 个最高工资(100% 正确)

SELECT Salary FROM Employee ORDER BY Salary DESC LIMIT N-1,1; SELECT Salary FROM Employee ORDER BY Salary DESC LIMIT N-1,1;

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

where N represents the nth highest salary ..其中 N 代表第 n 个最高工资..

Third highest salary :第三高薪:

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

The query to get the nth highest record is as follows:获取第n个最高记录的查询如下:

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

It's simple and easy to understand简单易懂

For 4th highest salary:对于第四高的工资:

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

For n th highest salary:对于第 n 个最高工资:

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

This will work To find the nth maximum number这将工作以找到第n 个最大数字

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

For Fifth Largest number对于第五大数

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

This is salary table这是工资表

在此处输入图片说明

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

Or要么

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

To get 2nd highest salary:要获得第二高的薪水:

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

To get Nth highest salary:要获得第 N 个最高薪水:

SELECT   salary 
FROM     [employees] 
ORDER BY salary DESC 
offset   **n-1** rows 
FETCH next 1 rows only
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'; 
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';

=>this for 3rd highest salary. =>这是第三高的工资。 for nth replace 3 value.对于第 n 个替换 3 值。 for example 5th highest:例如第五高:

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';

试试这个解决方案。

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

Let there be table salaries containing让表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    |
+----------+--------+--------+

By Nested Queries: (where you can change offset 0/1/2... for first, second and third... place respectively)通过嵌套查询:(您可以在其中更改偏移量 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);

or might be by creating rank: (where you can change rank= 1/2/3... for first, second and third... place respectively)或者可能是通过创建排名:(您可以在其中更改排名 = 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;

I have used Procedure for this query我已经为此查询使用了过程

here getHighestSalary<\/code> procedure, reports the nth highest salary from the Employee table.这里的getHighestSalary<\/code>过程报告 Employee 表中的第 n 个最高薪水。 If there is no nth highest salary, the query should report null.如果没有第 n 个最高薪水,则查询应报告 null。

first, create table首先,创建表

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

If you want to get all the records of the employees who has third highest salary then you can use this sql query:如果您想获取工资排名第三的员工的所有记录,则可以使用以下sql查询:

Table name: salary表名:工资

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM