如何在MySQL中不进行子查询获取最高的第二工资
SELECT sal FROM jos_salary ORDER BY sal DESC LIMIT 1,1;发布于 2016-09-09 09:06:41
这个问题的解决方案使用groupwise maximum方法很容易完成,方法是根据每一行的较高编号将表连接到自己。使用此方法,您可以检索任何您喜欢的最高位置,这取决于联接的数量或单个联接中的行数。这取决于你最喜欢哪种方法(海事组织,第二种计算方法更优雅)。
下面是使用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。
祝面试顺利!-)
发布于 2017-03-17 20:39:09
这样可以找到第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;https://stackoverflow.com/questions/39406994
复制相似问题