【oracle练习笔记】 - 001

DishBrain / 2024-10-16 / 原文

* 题目链接

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)规则。分区是将结果集划分为更小的组,每个组独立地应用窗口函数。排序则决定了在每个分区或整个结果集中行的顺序。