查找第二高的薪水

题目:编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary

+----+--------+

| Id | Salary |

+----+--------+

| 1 | 100 |

| 2 | 200 |

| 3 | 300 |

+----+--------+

例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,

那么查询应返回 null。

+---------------------+

| SecondHighestSalary |

+---------------------+

| 200 |

+---------------------+

SQL:

select min(salary) as "SecondHighestSalary"
  from (select salary, row_number() over(order by salary desc) rn
          from (select distinct Salary from Employee))
 where rn != 1
   and rn <= 2

rn!=1是为了防止Table中只有一条数据。

当where条件不成立时,min(salary)的结果是空值,聚合函数为空的时候返回null

具体题目详情见:https://leetcode-cn.com/problems/second-highest-salary/

### SQL查询薪水的员工工资 要实现查询薪水的员工工资,可以采用多种方法。以下是几种常见的解决方案: #### 方法一:使用 `MAX` 函数 通过聚合函数 `MAX()` 获取最薪资,并结合子查询返回对应的员工信息。 ```sql SELECT e.name AS Employee, e.salary AS Salary FROM Employee e WHERE e.salary = ( SELECT MAX(e2.salary) FROM Employee e2 ); ``` 这种方法的核心在于利用子查询计算出整个表中的最大薪资值[^1],并将其与外部查询的薪资字段进行匹配。 --- #### 方法二:使用窗口函数 `ROW_NUMBER()` 窗口函数能够更灵活地处理数据排序问题。这里可以通过 `ROW_NUMBER()` 对薪资降序排列,并标记排名第一的数据。 ```sql WITH RankedSalaries AS ( SELECT name, salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank_num FROM Employee ) SELECT name AS Employee, salary AS Salary FROM RankedSalaries WHERE rank_num = 1; ``` 此方法的优势在于支持扩展性操作,比如筛选多个排名靠前的结果[^2]。 --- #### 方法三:自连接方式 通过将表格与其自身的分组结果相连,可以直接定位具有最薪资的记录。 ```sql SELECT e1.name AS Employee, e1.salary AS Salary FROM Employee e1 JOIN ( SELECT departmentId, MAX(salary) AS max_salary FROM Employee GROUP BY departmentId ) e2 ON e1.departmentId = e2.departmentId AND e1.salary = e2.max_salary; ``` 这种方式特别适用于按部门或其他分类条件检索的情况[^4]。尽管题目未提及具体分类需求,但该逻辑同样可用于全局范围内的最薪资查找。 --- #### 综合分析 以上三种方案各有优劣: - **性能方面**:如果仅需简单求取单一数值,则直接运用 `MAX()` 的效率较;而涉及复杂业务场景时,推荐考虑基于窗口函数或者自联结的设计思路。 - **适用场合**:当存在额外约束(如限定特定部门),第三种办法更具针对性[^3]。 最终选择取决于实际应用场景以及数据库引擎特性等因素的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值