LeetCode176 & 177. Second/NtH Highest Salary - 第 2/N 高的薪水 <Medium>

本文介绍如何使用SQL查询获取员工表中的第二高薪水,并提供多种解决方案,包括通过排序和限制查询结果的方法,以及通过查找最高薪水之下次高的薪水的方法。

编写一个 SQL 查询,获取 Employee 表中第二/N高的薪水(Salary) 。

+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

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

+---------------------+
| SecondHighestSalary |
+---------------------+
| 200                 |
+---------------------+

 

Write a SQL query to get the second highest salary from the Employee table.
For example, given the above Employee table, the query should return 200 as the second highest salary. If there is no second highest salary, then the query should return null.

 

第二高薪水,有以下几种思路:

1、可以对薪水进行降序排序,第二高薪水即为第二条记录 -> offset 1,限制返回一条记录 -> limit 1;

2、第二高薪水即最高薪水之下的最高薪水,即排除一个最高薪水后的序列最大值;

# Method 1
select (
    select distinct Salary from Employee order by Salary desc limit 1 offset 1
) as SecondHighestSalary 

select 
    IFNULL((select distinct Salary from Employee order by Salary desc limit 1 offset 1),NULL) 
as SecondHighestSalary
# Method 2
select Max(Salary) as SecondHighestSalary
from Employee
where Salary < (select Max(Salary) from Employee)

 

Plus 第N高薪水解法; 注:limit 1 offset N 即跳过N个元素,向后取一个元素,等价于limit N,1

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  set N = N-1;
  RETURN (
      # Write your MySQL query statement below.
        select IFNULL((select distinct Salary from Employee order by Salary desc limit 1 offset N),NULL) as SecondHighestSalary 
      );
END

另解:Employee两张临时表a、b,b表中有N-1条a表大的数据时,a表的MAX(Salary)为第N高薪;

select MAX(Salary) as getNthHighestSalary from Employee a
where N -1 =
(select count(distinct b.Salary) from Employee b where b.Salary > a.Salary)

第二高薪即:

select MAX(Salary) as SecondHighestSalary from Employee a
where 1 =
(select count(distinct b.Salary) from Employee b where b.Salary > a.Salary)

 

【顶刊TAC复现】事件触发模型参考自适应控制(ETC+MRAC):针对非线性参数不确定性线性部分时变连续系统研究(Matlab代码实现)内容概要:本文档介绍了&ldquo;事件触发模型参考自适应控制(ETC+MRAC)&rdquo;的研究与Matlab代码实现,聚焦于存在非线性参数不确定性且具有时变线性部分的连续系统。该研究复现了顶刊IEEE Transactions on Automatic Control(TAC)的相关成果,重点在于通过事件触发机制减少控制器更新频率,提升系统资源利用效率,同时结合模型参考自适应控制策略增强系统对参数不确定性和外部扰动的鲁棒性。文档还展示了大量相关科研方向的技术服务内容,涵盖智能优化算法、机器学习、路径规划、电力系统、信号处理等多个领域,并提供了Matlab仿真辅导服务及相关资源下载链接。; 适合人群:具备自动控制理论基础、非线性系统分析背景以及Matlab编程能力的研究生、博士生及科研人员,尤其适合从事控制理论与工程应用研究的专业人士。; 使用场景及目标:① 复现顶刊TAC关于ETC+MRAC的先进控制方法,用于非线性时变系统的稳定性与性能优化研究;② 学习事件触发机制在节约通信与计算资源方面的优势;③ 掌握模型参考自适应控制的设计思路及其在不确定系统中的应用;④ 借助提供的丰富案例与代码资源开展科研项目、论文撰写或算法验证。; 阅读建议:建议读者结合控制理论基础知识,重点理解事件触发条件的设计原理与自适应律的构建过程,运行并调试所提供的Matlab代码以加深对算法实现细节的理解,同时可参考文中列举的其他研究方向拓展应用场景。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值