首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何不用子查询、限制和top子句在mysql中找到第二高工资

问如何不用子查询、限制和top子句在mysql中找到第二高工资
EN

Stack Overflow用户
提问于 2016-09-09 08:20:29
回答 2查看 3.1K关注 0票数 1

如何在MySQL中不进行子查询获取最高的第二工资

代码语言:javascript
复制
SELECT sal FROM jos_salary ORDER BY sal DESC LIMIT 1,1;
EN

回答 2

Stack Overflow用户

发布于 2016-09-09 09:06:41

这个问题的解决方案使用groupwise maximum方法很容易完成,方法是根据每一行的较高编号将表连接到自己。使用此方法,您可以检索任何您喜欢的最高位置,这取决于联接的数量或单个联接中的行数。这取决于你最喜欢哪种方法(海事组织,第二种计算方法更优雅)。

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

代码语言:javascript
复制
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

或计算连接匹配的数量:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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等等。

结果如下:

代码语言:javascript
复制
+------+-------------+
| sal  | sals_higher |
+------+-------------+
| 7100 | 0           |
| 7000 | 1           |
| 6900 | 2           |
| 5400 | 3           |
| 5000 | 4           |
| 4700 | 5           |
+------+-------------+

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

祝面试顺利!-)

票数 3
EN

Stack Overflow用户

发布于 2017-03-17 20:39:09

这样可以找到第n个最大数(自动增量)。

代码语言:javascript
复制
SELECT 
    TOP 1 * from (SELECT TOP  nth_largest_no * FROM Products Order by sal desc) ORDER BY sal asc;

第五大酒庄

代码语言:javascript
复制
SELECT 
  TOP 1 sal  from (SELECT TOP  5 sal FROM sal Order by price desc) ORDER BY sal asc;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39406994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档