【发布时间】:2011-07-18 16:02:47
【问题描述】:
我有一张这样定义的员工和工资表:
"name" (type: VARCHAR)
"salary" (type: INTEGER)
我可以使用什么查询来获得该表中第二高的薪水?
【问题讨论】:
-
如果您有 2 个或多个名字的最高或第二高薪水怎么办?
-
@Pentium - 我也有同样的疑惑......相应地回答了
标签: mysql
我有一张这样定义的员工和工资表:
"name" (type: VARCHAR)
"salary" (type: INTEGER)
我可以使用什么查询来获得该表中第二高的薪水?
【问题讨论】:
标签: mysql
SELECT SALARY
FROM (SELECT *
FROM EMPLOYEE
ORDER BY SALARY
DESC LIMIT ***2***) AS TOP_SALARY
ORDER BY SALARY ASC
LIMIT 1
【讨论】:
看来我回答这个问题已经晚了。这一个班轮如何获得相同的输出?
SELECT DISTINCT salary FROM employees ORDER BY salary DESC LIMIT 1,1 ;
【讨论】:
DISTINCT 在这里是多余的,因为限制已经设置为 1。
limit 被定义为 1。所以 limit 将大小设置为一行,所以 DISTINCT 变得多余.
DISTINCT”返回错误值。
SELECT name, salary
FROM employees
where
salary = (SELECT (salary) FROM employees GROUP BY salary DESC LIMIT 1,1)
【讨论】:
要获得第二高的值:
SELECT `salary` FROM `employees` ORDER BY `salary` DESC LIMIT 1, 1;
【讨论】:
试试这个:
SELECT DISTINCT(`salary`)
FROM `employee`
ORDER BY `salary` DEC
LIMIT 1,1
【讨论】:
SELECT name, salary
FROM employees
order by salary desc limit 1,1
这个查询应该可以完成您的工作。
首先,我们按降序对表格进行排序,因此薪水最高的人排在最前面,第二高的人排在第二位。现在limit a,b 表示跳过开始的a 元素,然后打印下一个b 元素。所以在这种情况下你应该使用limit 1,1。
希望这会有所帮助。
【讨论】:
要获得第二高的薪水,只需使用以下查询
SELECT salary FROM employees
ORDER BY salary DESC LIMIT 1,1;
【讨论】:
试试这个:
Proc sql;
select employee, salary
from (select * from test having salary < max(salary))
having salary = max(salary)
;
Quit;
【讨论】:
使用以下查询获得第二、第三、第四……第 N 高薪
SELECT MIN(salary) from employees WHERE salary IN( SELECT TOP N salary FROM employees ORDER BY salary DESC)
用你的数字替换 N,即 N=2 表示第二高的薪水, N=3 表示第三高的薪水,依此类推。所以对于第二高的薪水使用
SELECT MIN(salary) from employees WHERE salary IN( SELECT TOP 2 salary FROM employees ORDER BY salary DESC)
【讨论】:
您可以使用下面提到的查询
SELECT emp.name, emp.salary
FROM employees emp
WHERE 2 = (SELECT COUNT(DISTINCT salary)
FROM employees
WHERE emp.salary<=salary
);
您可以将 2 更改为您想要的最高记录。
【讨论】:
SELECT name,salary FROM employee
WHERE salary = (SELECT DISTINCT(salary) FROM employee ORDER BY salary DESC LIMIT 1,1) ORDER BY name
【讨论】:
SELECT DISTINCT Salary
FROM emp
ORDER BY salary DESC
LIMIT 1 , 1
这个查询也会给出重复记录的第二高薪水。
【讨论】:
这是一个说明关系的问题。
Name Salary
Jim 6
Foo 5
Bar 5
Steve 4
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees WHERE salary < (SELECT MAX(salary) FROM employees))
Result --> Bar 5, Foo 5
编辑: 我接受了 Manoj 的第二篇文章,对其进行了调整,使其更具可读性。对我来说 n-1 并不直观;但是,使用我想要的值,2=2nd、3=3rd 等等。
/* looking for 2nd highest salary -- notice the '=2' */
SELECT name,salary FROM employees
WHERE salary = (SELECT DISTINCT(salary) FROM employees as e1
WHERE (SELECT COUNT(DISTINCT(salary))=2 FROM employees as e2
WHERE e1.salary <= e2.salary)) ORDER BY name
Result --> Bar 5, Foo 5
【讨论】:
SELECT username, salary
FROM tblname
GROUP by salary
ORDER by salary desc
LIMIT 0,1 ;
【讨论】:
with alias as
(
select name,salary,row_number() over(order by salary desc ) as rn from employees
)
select name,salary from alias where rn=n--n being the nth highest salary
【讨论】:
要获得第 *N* 个最高值,最好使用此解决方案:
SELECT * FROM `employees` WHERE salary =
(SELECT DISTINCT(salary) FROM `employees`
ORDER BY salary DESC LIMIT {N-1},1);
或者你可以试试:
SELECT * FROM `employees` e1 WHERE
(N-1) = (SELECT COUNT(DISTINCT(salary))
FROM `employees` e2
WHERE e1.salary < e2.salary );
N=2 为第二高 N=3 为第三高,依此类推。
【讨论】:
SELECT MIN(id) as id FROM students where id>(SELECT MIN(id) FROM students);
【讨论】:
SELECT name, salary
FROM EMPLOYEES
WHERE salary = (
SELECT DISTINCT salary
FROM EMPLOYEES
ORDER BY salary DESC
LIMIT 1 , 1 )
【讨论】:
第二高薪水的直接答案
SELECT name, salary
FROM employees ORDER BY `employees`.`salary` DESC LIMIT 1 , 1
另一个有趣的解决方案
SELECT salary
FROM emp
WHERE salary = (SELECT DISTINCT(salary)
FROM emp as e1
WHERE (n) = (SELECT COUNT(DISTINCT(salary))
FROM emp as e2
WHERE e1.salary <= e2.salary))
【讨论】:
SELECT MAX(salary) salary
FROM tbl
WHERE salary <
(SELECT MAX(salary)
FROM tbl);
【讨论】:
第二高的薪水
select max(salary) from salary where salary not in (select top 1 salary from salary order by salary desc)
第三高的薪水
select max(salary) from salary where salary not in (select top 2 salary from salary order by salary desc)
等等……
【讨论】:
找到另一个有趣的解决方案
SELECT salary
FROM emp
WHERE salary = (SELECT DISTINCT(salary)
FROM emp as e1
WHERE (n) = (SELECT COUNT(DISTINCT(salary))
FROM emp as e2
WHERE e1.salary <= e2.salary))
对不起。忘记写了。 n是你想要的第n个薪水。
【讨论】:
简单的解决方案如下查询:
select max(salary) as salary from employees where salary<(select max(salary) from employees);
【讨论】:
试试这个可以获得第n个最高薪水
我在发布之前已经尝试过,效果很好
例如。找到第 10 个最高工资替换 limit 9,1;
mysql> select name,salary from emp group by salary desc limit n-1,1;
【讨论】:
倒数第二个:
SELECT name, salary
FROM employee
ORDER BY salary DESC
LIMIT 1 , 1
第三个:
SELECT name, salary
FROM employee
ORDER BY salary DESC
LIMIT 2 , 1
【讨论】:
简单的解决方案
SELECT * FROM TBLNAME ORDER BY COLNAME ASC LIMIT (n - x), 1
注意:n = 列中的总记录数
x = value 2nd, 3rd, 4th highest etc
例如
//to find employee with 7th highest salary
n = 100
x = 7
SELECT * FROM tbl_employee ORDER BY salary ASC LIMIT 93, 1
希望对你有帮助
【讨论】:
显示具有第二大标记值的记录:
SELECT username, mark
FROM tbl_one
WHERE mark = (
SELECT DISTINCT mark
FROM tbl_one
ORDER by mark desc
LIMIT 1,1
);
【讨论】:
create table svalue (
name varchar(5),
value int
) engine = myisam;
insert into svalue value ('aaa',30),('bbb',10),('ccc',30),('ddd',20);
select * from svalue where value = (
select value
from svalue
group by value
order by value desc limit 1,1)
【讨论】: