SQL查询在公司中查找第三高薪

时间:2013-12-19 20:02:57

标签: sql

我需要编写一个查询,该查询将返回公司中第三位受薪最高的员工。

我试图用子查询来完成这个,但是无法得到答案。我的尝试如下:

select Max(salary)
from employees
where Salary not in

 (select Max(salary)
from employees
where Salary not in 

(select Max(salary)
from employees));

我的想法是我可以使用2个子查询来消除第一和第二高的工资。然后我可以简单地选择剩下的MAX()薪水。这是一个不错的选择,还是有更好的方法来实现这一目标?

26 个答案:

答案 0 :(得分:14)

在任何数据库中应该运行的最简单的方法是执行以下操作:

SELECT * FROM `employee` ORDER BY `salary` DESC LIMIT 1 OFFSET 2;

按工资对员工进行排序,然后告诉db返回结果集中第三行(OFFSET中为2)的单个结果(LIMIT中为1)。如果您的数据库计算的结果行数为1而不是0,则可能为OFFSET 3

此示例应适用于MySQL和PostgreSQL。

答案 1 :(得分:6)

通过使用限制,使用TOP关键字和子查询

,您可以获得第三高薪
  1. TOP关键字

    SELECT TOP 1 salary 
    FROM 
        (SELECT TOP 3 salary 
         FROM Table_Name 
         ORDER BY salary DESC) AS Comp 
    ORDER BY salary ASC
    
  2. 限制

    SELECT salary 
    FROM Table_Name 
    ORDER BY salary DESC 
    LIMIT 2, 1
    
  3. 通过子查询

    SELECT salary  
    FROM 
        (SELECT salary 
         FROM Table_Name 
         ORDER BY salary DESC 
         LIMIT 3) AS Comp 
    ORDER BY salary 
    LIMIT 1;
    
  4. 我认为其中任何一个都可以帮到你。

答案 2 :(得分:4)

您可以尝试(如果是MySQL):

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

此查询在跳过两行后返回一行。

您可能还想要返回不同的薪水。例如,如果您有20,20,10和5,那么5是第三高薪。为此,请将DISTINCT添加到上述查询中:

SELECT DISTINCT salary FROM employee ORDER BY salary DESC LIMIT 2, 1;

答案 3 :(得分:3)

SELECT id 来自tablename ORDER BY id DESC 限制2,1,

这只是获得第三高的值。

答案 4 :(得分:2)

如果SQL Server可以正常工作

SELECT TOP (1) * FROM
   (SELECT TOP (3) salary FROM employees ORDER BY salary DESC) T
ORDER BY salary ASC

至于您的子查询数量问题取决于您的语言。查看此信息以获取更多信息

Is there a nesting limit for correlated subqueries in Oracle?

答案 5 :(得分:2)

SELECT Max(salary) 
FROM   employee 
WHERE  salary < (SELECT Max(salary) 
                 FROM   employee 
                 WHERE  salary NOT IN(SELECT Max(salary) 
                                      FROM   employee)) 

希望这有助于你

答案 6 :(得分:1)

某些DBMS不允许您运行多个嵌套查询。这是一个仅使用1个嵌套查询的解决方案:

SELECT salary
FROM
(
   SELECT salary
   FROM employees
   ORDER BY salary
   LIMIT 3
) as TBL1
ORDER BY salary DESC
LIMIT 1;

它应该给你想要的结果。它首先找到3个最大的工资,然后选择三个中最小的(如果它们相等则选择第三个)。这是SQLFiddle

答案 7 :(得分:1)

我在

中找到了一个非常好的解释
  

http://www.programmerinterview.com/index.php/database-sql/find-nth-highest-salary-sql/

此查询应提供nth最高薪水

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

答案 8 :(得分:1)

SELECT * FROM <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="question"> <div id="old" class="left_side one_half"> <a href="#" data-number="1"><img src="http://placehold.it/350x150"></a> <a href="#" data-number="2"><img src="http://placehold.it/350x150"></a> </div> <div class="right_side one_half"> <a href="#" data-letter="EI"><img data-letter="EI" src="http://placehold.it/350x150"></a> <a href="#" data-letter="AL"><img data-letter="EI" src="http://placehold.it/350x150"></a> </div> </div> <div class="answer_1"> <input class="inputs letter square border_black" maxlength="1" type="text" /> <input class="inputs letter square border_black" maxlength="1" type="text" /> ORDER BY employee DESC LIMIT 1 OFFSET 2;

答案 9 :(得分:0)

您只需使用一个简单易懂的查询即可找到第 N 个最高工资:-

<块引用>

从员工 e1 中选择工资,其中 N-1=(select count(distinct 工资)来自员工 e2,其中 e2.salary>e1.salary);

此处将“N”替换为数字(1,2,3,4,5...)。即使工资重复,此查询也能正常工作。这个查询背后的简单想法是内部子查询 计算有多少薪水高于(N-1)。当我们得到计数时,游标将指向 N 行,它只返回该行中存在的工资。

答案 10 :(得分:0)

这适用于 Oracle 数据库。

select SAL from ( SELECT DISTINCT SAL FROM EMP ORDER BY SAL DESC FETCH FIRST 3 ROWS ONLY ) ORDER BY SAL  ASC FETCH FIRST 1 ROWS ONLY

答案 11 :(得分:0)

你可以得到任何薪水订单:

select * from 
(
select salary,row_Number() over (order by salary DESC ) RN 
FROM employees
)s
where RN = 3

-- 把 RN 等于任意数量的订单。 --对于您的问题,请输入 3

答案 12 :(得分:0)

在Sql Query中你可以获得nth最高的薪水

选择 * 来自( 选择 empname、sal、dense_rank() over(从员工的sal desc下单)r) 其中 r=&n;

找到第二高的sal集n = 2

找到第 3 个最高的 Sal 集合 n = 3 等等。

答案 13 :(得分:0)

这是一个 MYSQL 查询。

说明:子查询返回前 3 个薪水。从返回的结果中,我们选择最低工资,也就是第三高的工资。

SELECT MIN(Salary)
FROM (
    SELECT Salary
    FROM Employees
    ORDER BY Salary DESC
    LIMIT 3
) AS TopThreeSalary;

答案 14 :(得分:0)

您可以将其用于所有薪水第三高的员工:

SELECT * FROM `employee` WHERE salary = (
   SELECT DISTINCT(`salary`) FROM `employee` ORDER BY `salary` DESC LIMIT 1 OFFSET 2
);

答案 15 :(得分:0)

下面的查询将给出准确的答案。跟随并给我评论:

select top 1 salary from (
select DISTINCT  top 3 salary from Table(table name) order by salary  ) as comp
order by personid salary 

答案 16 :(得分:0)

其SQL-Server实现将是:

SELECT SALARY FROM EMPLOYEES OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY

答案 17 :(得分:0)

对于oracle来说是这样的:

select salary from employee where rownnum<=3 order by salary desc
minus
select salary from employee where rownnum<=2 order by salary desc;

答案 18 :(得分:0)

您可以使用嵌套查询来获取该信息,就像下面解释的那样,这是第三笔最高工资。每个嵌套的薪水都会为您提供最高的薪水,其中包含过滤后的where结果,最后,无论相同薪水的记录数如何,它都会返回准确的第三高薪。

select * from users where salary < (select max(salary) from users where salary < (select max(salary) from users))  order by salary desc limit 1

答案 19 :(得分:0)

CTE AS (     选择薪水,            RN = ROW_NUMBER()以上(按薪金DESC排序)     来自员工 ) 选择薪水 来自CTE RN = 3

答案 20 :(得分:0)

我们可以通过此查询找到最高的第n个薪资。

WITH EMPCTE AS( 选择E. *,DENSE_RANK()OVER(按SALARY DESC排序)作为DENSERANK   来自员工E ) SELECT * FROM EMPCTE WHERE DENSERANK =&amp; NUM

答案 21 :(得分:0)

const minNumber = 3
const maxNumber = 6

let divisible = false
let totalGroups = 0
let perGroup = 0

const attendees = ['chris', 'kevin', 'thomas', 'gio', 'nathan', 'michael', 'elyse', 'sarah', 'jacinthe', 'chloe', 'benoit', 'alex', 'darren', 'john']
const totalAttendees = attendees.length

// Can we divide into equal groups?
for (let divider = maxNumber; minNumber <= divider; divider--) {
  totalGroups = totalAttendees / divider

  if (Number.isInteger(totalGroups)) {
    divisible = true
    perGroup = divider
    break
  }
}

// Nope, so divide teams and make sure their between our min and max
if (!divisible) {
  totalGroups = 0;

  for (let j = maxNumber, remainder = 0; minNumber <= j; j--) {
    remainder = totalAttendees % j

    if (remainder >= minNumber && remainder <= maxNumber) {
      perGroup = j;
      break
    }
  }
}

console.log(JSON.stringify(_.chunk(attendees, perGroup)))

我尝试过其他不正确的方法。这个有效。

答案 22 :(得分:0)

从员工中选择最低工资(薪水),其中工资(从薪资工具中选择员工订单中的前3名工资)

答案 23 :(得分:0)

对我来说,这个查询在Mysql中运行正常 它将从表中返回第三个最高工资

SELECT salary FROM users ORDER BY salary DESC LIMIT 1 OFFSET 2;

SELECT salary FROM users ORDER BY salary DESC LIMIT 2,1;

答案 24 :(得分:-1)

您可以使用此查询找到第三大薪水:

SELECT min(salary) 
FROM tblEmployee 
WHERE salary IN (SELECT TOP(3) salary 
                 FROM tblEmployee 
                 ORDER BY salary DESC)

答案 25 :(得分:-1)

请注意,第三个最高工资可能与第一个最高工资相同,因此您当前的方法不起作用。

我会按工资对员工进行排序,并在SQL查询结束时应用LIMIT 3。那么你将获得薪水最高的前三名,因此,你也有第三高的工资(如果有一个,公司可能有两个雇员,那么你就没有第三个最高工资)。