我需要编写一个查询,该查询将返回公司中第三位受薪最高的员工。
我试图用子查询来完成这个,但是无法得到答案。我的尝试如下:
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()
薪水。这是一个不错的选择,还是有更好的方法来实现这一目标?
答案 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关键字和子查询
,您可以获得第三高薪 TOP
关键字
SELECT TOP 1 salary
FROM
(SELECT TOP 3 salary
FROM Table_Name
ORDER BY salary DESC) AS Comp
ORDER BY salary ASC
限制
SELECT salary
FROM Table_Name
ORDER BY salary DESC
LIMIT 2, 1
通过子查询
SELECT salary
FROM
(SELECT salary
FROM Table_Name
ORDER BY salary DESC
LIMIT 3) AS Comp
ORDER BY salary
LIMIT 1;
我认为其中任何一个都可以帮到你。
答案 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)
选择 * 来自( 选择 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
。那么你将获得薪水最高的前三名,因此,你也有第三高的工资(如果有一个,公司可能有两个雇员,那么你就没有第三个最高工资)。