📜  如何从表中找到第 N 个最高薪水

📅  最后修改于: 2022-05-13 01:55:26.781000             🧑  作者: Mango

如何从表中找到第 N 个最高薪水

在表格中找到第 N 个最高薪水是面试中最常见的问题。这是一种使用 dense_rank()函数完成此任务的方法。

考虑下表:
员工

ename sal 
A23000
B31000
C24500
D35000
E28500
F31500
G39800
H51000
I39800

询问 :

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:

  1. DENSE_RANK 计算行在有序行组中的排名,并将排名作为 NUMBER 返回。秩是从 1 开始的连续整数。
  2. 此函数接受任何数字数据类型的参数并返回 NUMBER。
  3. 作为一个分析函数,DENSE_RANK 根据 order_by_clause 中 value_exprs 的值计算查询返回的每一行相对于其他行的排名。
  4. 在上面的查询中,排名是根据员工表的 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 高的员工。我们可以这样做:

  1. 找出具有前 N 个不同薪水的员工。
  2. 在上述查询获取的薪水中找到最低的薪水,这将为我们提供第 N 个最高薪水。
  3. 查找工资是上述查询获取的最低工资的员工的详细信息。

查询

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