【oracle练习笔记】 - 001
* 题目链接
https://leetcode.cn/problems/second-highest-salary/description/
* 题目描述
Employee
表:
+-------------+------+ | Column Name | Type | +-------------+------+ | id | int | | salary | int | +-------------+------+ id 是这个表的主键。 表的每一行包含员工的工资信息。
查询并返回 Employee
表中第二高的 不同 薪水 。如果不存在第二高的薪水,查询应该返回 null(Pandas 则返回 None)
。
查询结果如下例所示。
示例 1:
输入: Employee 表: +----+--------+ | id | salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ 输出: +---------------------+ | SecondHighestSalary | +---------------------+ | 200 | +---------------------+
示例 2:
输入: Employee 表: +----+--------+ | id | salary | +----+--------+ | 1 | 100 | +----+--------+ 输出: +---------------------+ | SecondHighestSalary | +---------------------+ | null | +---------------------+
* 提交代码
select max(salary) as SecondHighestSalary from Employee where salary < (select max(salary) from Employee) /*先找到Employee表中最大的salary作为SecondHighestSalary 判断它是不是小于子查询找到的最大salary 如果是就返回这个值,如果不是就返回null,循环判断表中的每行数据*/
* 知识点
1、max()聚合函数,用于返回一组值中的最大值。
* 优化
select max(salary) as SecondHighestSalary from ( select dense_rank() over (order by salary desc) as num,id,salary from employee ) where num = '2'; /*在内部查询语句中选择排名第二的薪资*/ /*内部查询:使用dense_rank()函数为employee表中的每一行都分配一个基于薪资降序的排名rum*/
* 知识点
1、DENSE_RANK() 函数
DENSE_RANK()
是一个窗口函数,用于为结果集中的每一行分配一个唯一的排名。这个排名是基于ORDER BY
子句中指定的列的值。与RANK()
函数不同,DENSE_RANK()
在处理重复值时不会跳过排名。也就是说,如果有两行或多行具有相同的值,它们将被分配相同的排名,而下一个不同的值将紧接着这个排名,不会有间隔。
2、over() 子句
OVER()
子句定义了窗口函数的窗口,即函数将如何应用于结果集中的行。它指定了窗口函数的分区(Partition)和排序(Order)规则。分区是将结果集划分为更小的组,每个组独立地应用窗口函数。排序则决定了在每个分区或整个结果集中行的顺序。