如何在不使用子查询,限制和顶级子句的情况下在mysql中找到第二高的工资

时间:2016-09-09 08:20:30

标签: mysql

如何在MySQL中没有子查询的情况下获取最高的第二个薪水

SELECT sal FROM jos_salary ORDER BY sal DESC LIMIT 1,1;

2 个答案:

答案 0 :(得分:2)

使用 groupwise maximum 方法可以轻松地完成此promlem的解决方案,方法是根据每行的较大数字将表连接到自身。使用此方法,您可以检索任何您喜欢的最高位置,具体取决于连接数或计算单个连接中的行数。取决于你最喜欢什么方法(IMO第二个计数更优雅)。

以下是使用groupwise方法解决问题的方法:

SELECT s1.sal
FROM job_salary s1
LEFT JOIN job_salary s2 ON s1.sal < s2.sal
LEFT JOIN job_salary s3 ON s2.sal < s3.sal
GROUP BY s1.sal
HAVING MAX(s3.sal) IS NULL AND MAX(s2.sal) IS NOT NULL

或计算联接匹配的数量:

SELECT s1.sal
FROM job_salary s1
LEFT JOIN job_salary s2 ON s1.sal < s2.sal
GROUP BY s1.sal
HAVING COUNT(DISTINCT s2.sal) = 1

顺便说一下,如果你这样做:

SELECT s1.sal, COUNT(DISTINCT s2.sal) AS sals_higher
FROM job_salary s1
LEFT JOIN job_salary s2 ON s1.sal < s2.sal
GROUP BY s1.sal
ORDER BY s1.sal DESC

您可以看到从最高薪水到最低薪水排序的结果以及序列号表示s2中每行s1的联接行数。当您在条件s1.sal < s2.sal上将表连接到自身时,对于每一行,它加入s2的工资数量,该工资数量高于s1中的当前工资。
例如,在最高工资上,没有比这更高的工资,因为它是最高的工资,这就是为什么你得到0,而在第二高的工资,我们只有一个薪水越高,这是最高的,这就是为什么我们得到1等等 以下是结果:

+------+-------------+
| sal  | sals_higher |
+------+-------------+
| 7100 | 0           |
| 7000 | 1           |
| 6900 | 2           |
| 5400 | 3           |
| 5000 | 4           |
| 4700 | 5           |
+------+-------------+

现在,您所要做的就是在HAVING子句中提供适合的条件,在您的情况下等于1

祝你好运! : - )

答案 1 :(得分:0)

这将有效找到第n个最大数(自动增量)

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

对于第五大销售

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