如何在MySQL中没有子查询的情况下获取最高的第二个薪水
SELECT sal FROM jos_salary ORDER BY sal DESC LIMIT 1,1;
答案 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;