如何从表中找到第 N 个最高薪水
在表格中找到第 N 个最高薪水是面试中最常见的问题。这是一种使用 dense_rank()函数完成此任务的方法。
考虑下表:
员工
ename sal A 23000 B 31000 C 24500 D 35000 E 28500 F 31500 G 39800 H 51000 I 39800
询问 :
select * from(
select ename, sal, dense_rank()
over(order by sal desc)r from Employee)
where r=&n;
To find to the 2nd highest sal set n = 2
To find 3rd highest sal set n = 3 and so on.
输出 :
DENSE_RANK:
- DENSE_RANK 计算行在有序行组中的排名,并将排名作为 NUMBER 返回。秩是从 1 开始的连续整数。
- 此函数接受任何数字数据类型的参数并返回 NUMBER。
- 作为一个分析函数,DENSE_RANK 根据 order_by_clause 中 value_exprs 的值计算查询返回的每一行相对于其他行的排名。
- 在上面的查询中,排名是根据员工表的 sal 返回的。在平局的情况下,它为所有行分配相同的排名。
替代解决方案:
————————————————————————————————————————————————————— ——————————————————————
CREATE TABLE `Employee` (
`ENAME` varchar(225) COLLATE utf8_unicode_ci NOT NULL,
`SAL` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`ENAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
————————————————————————————————————————————————————— ————
6th highest
mysql> select * from ((select * from Employee
ORDER BY `sal` DESC limit 6 ) AS T)
ORDER BY T.`sal` ASC limit 1;
Alternate use of Limit:
select * from Employee ORDER BY `sal` ASC limit 5,1; // will return 6th highest
+-------+-----+
| ENAME | SAL |
+-------+-----+
| B | 300 |
+-------+-----+
1 row in set (0.00 sec)
————————————————————————————————————————————————————— –
mysql> select * from Employee;
+-------+-----+
| ENAME | SAL |
+-------+-----+
| A | 100 |
| B | 300 |
| C | 200 |
| D | 500 |
| F | 400 |
| G | 600 |
| H | 700 |
| I | 800 |
+-------+-----+
8 rows in set (0.00 sec)
感谢Vijay提出这个替代解决方案。
替代解决方案 -
假设任务是从上表中找到薪水第 N 高的员工。我们可以这样做:
- 找出具有前 N 个不同薪水的员工。
- 在上述查询获取的薪水中找到最低的薪水,这将为我们提供第 N 个最高薪水。
- 查找工资是上述查询获取的最低工资的员工的详细信息。
查询:
SELECT * FROM Employee WHERE sal =
(
SELECT MIN(sal) FROM Employee
WHERE sal IN (
SELECT DISTINCT TOP N
sal FROM Employee
ORDER BY sal DESC
)
)
上面的查询将获取薪水第 N 高的员工的详细信息。让我们看看如何:
- 考虑 N = 4。
- 从最内部的查询开始,查询:“ SELECT DISTINCT TOP 4 sal FROM Employee ORDER BY sal DESC ”将产生以下结果:
51000
39800
35000
31500
- 下一个外部查询是:“ SELECT MIN(sal) FROM Employee WHERE sal IN (Result_Set_of_Previous_Query) ”。这将返回以下结果:
31500
- 可以看到上面返回的结果是要求的第 4 高薪水。
- 接下来是最外层的查询,即:“ SELECT * FROM Employee WHERE sal = Result_of_Previous_Query ”。此查询将返回薪水第四高的员工的详细信息。
________________________
ename sal
________________________
F | 31500
|
________________________
另一个解决方案——
这里 N = nth 最高薪水 例如。第三高薪:N=3。
SELECT ename,sal from Employee e1 where
N-1 = (SELECT COUNT(DISTINCT sal)from Employee e2 where e2.sal > e1.sal)
使用 Limit 的解决方案:
Select Salary from table_name order by Salary DESC limit n-1,1;
在这里,我们按降序排列我们的薪水,因此我们将首先获得最高薪水,然后再降低薪水。
Limit 子句有两个组成部分,第一个组成部分是从顶部跳过行数,第二个组成部分是显示我们想要的行数。
让我们看一个例子:
要查找第四个最高薪水查询将是:
Select Salary from table_name order by Salary DESC limit 3,1;
在这里,我们从 Top 跳过 3 行,跳过后只返回 1 行。
您还可以找到具有 Nth Highest Salary 的员工姓名
Select Emp_name from table_name where Salary =( Select Salary from table_name order by Salary DESC limit n-1,1);
可能还有另一个问题,例如 find Nth Lowest Salary 。为此,只需使用 ASC 反转顺序(如果您未指定默认列将按升序排序)。
Select Salary from table_name order by Salary limit n-1,1;
&t=176s