Employee 表:
id 是这个表的主键。
表的每一行包含员工的工资信息。
编写一个 SQL 查询,获取并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null 。
查询结果如下例所示。
示例 1:
输入:
Employee 表:
输出:
示例 2:
输入:
Employee 表:
输出:
解析:
方法1:子查询
SELECT max(salary) as SecondHighestSalary
FROM Employee
WHERE salary <
( SELECT max(salary)
FROM Employee)
样例1:
样例2:
方法2: LIMIT 和 OFFSET 组合
SELECT (
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 1) as secondhighestsalary;
样例1:
样例2:
LIMIT:表示取数据的条数,OFFSET表示跳过的数量。
方法3:窗口函数 DENSE_RANK()
DENSE_RANK()
函数的语法如下:
DENSE_RANK() OVER ( PARTITION BY <expression>[{,<expression>...}] ORDER BY <expression> [ASC|DESC], [{,<expression>...}] )
在这个语法中:
- 首先,
PARTITION BY
子句将FROM
子句生成的结果集划分为分区。DENSE_RANK()
函数应用于每个分区。 - 其次,
ORDER BY
子句指定DENSE_RANK()
函数操作的每个分区中的行顺序。
如果分区具有两个或更多具有相同排名值的行,则将为这些行中的每一行分配相同的排名。
SELECT max(salary) as SecondHighestSalary
FROM
(SELECT DISTINCT salary, DENSE_RANK() OVER (ORDER BY salary DESC) sale_rank
FROM employee) new
WHERE sale_rank = 2
样例1:
样例2:
注意:
力扣中投影的salary需要添加max函数,如果不添加max函数,在MySQL+Navicat下是正确的,但在力扣中则显示错误。