如何在MySQL中获取最高的第二薪水
SELECT sal FROM jos_salary ORDER BY sal DESC LIMIT 1,1;
这个问题的解决方案很容易通过使用分组最大方法来完成,方法是根据每行中较大的数字将表连接到表本身。使用此方法,您可以根据连接的数量或单个连接中的行数来检索您喜欢的任何最高位置。这取决于你最喜欢哪种方法(在我看来,第二个带计数的方法更优雅)。
下面是使用分组方法解决问题的方法:
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
您可以看到从最高到最低工资排序的结果,以及序列号,表示s1
中的每一行从s2
连接的行数。当您在条件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
。
祝你面试顺利!: -)
查找第n个最大值(auto increment)
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;