题目

176. 第二高的薪水

Employee 表:

+-------------+------+
| Column Name | Type |
+-------------+------+
| id | int |
| salary | int |
+-------------+------+

id 是这个表的主键。
表的每一行包含员工的工资信息。

查询并返回 Employee 表中第二高的 不同 薪水。如果不存在第二高的薪水,查询应该返回 null(Pandas 则返回 None)

解决办法:

select ifNull(
(
	select distinct Salary
	from Employee
	order by Salary desc limit 1, 1
)
, null) as SecondHighestSalary

也可以通过 max 获得最大的,然后连接查询,where 进行判断

select max(salary) as SecondHighestSalary  from (
    select salary, id ,dense_rank() over( order by salary desc ) r from Employee
) as temp where r =2

177. 第N高的薪水

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 N,1),null) as getNthHighestSalary
  );
END

178. 分数排名

+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| score | decimal |
+-------------+---------+
id 是该表的主键(有不同值的列)。
该表的每一行都包含了一场比赛的分数。Score 是一个有两位小数点的浮点值。

示例 1:

输入:
Scores 表:
+----+-------+
| id | score |
+----+-------+
| 1 | 3.50 |
| 2 | 3.65 |
| 3 | 4.00 |
| 4 | 3.85 |
| 5 | 4.00 |
| 6 | 3.65 |
+----+-------+
输出:
+-------+------+
| score | rank |
+-------+------+
| 4.00 | 1 |
| 4.00 | 1 |
| 3.85 | 2 |
| 3.65 | 3 |
| 3.65 | 3 |
| 3.50 | 4 |
+-------+------+

解法 1 窗口函数

select score,
dense_rank() over (order by score desc) as 'rank'
from Scores

解法 2 子查询

select s1.score,
(select count(distinct score) from Scores s2 where s1.score <= s2.score) as 'rank'
 from Scores s1
 order by score desc

解法 3 自关联,用 count()算出符合条件的行数作为 rank

select s1.score , count(distinct s2.score) as `rank` 
from Scores s1  cross join Scores s2
where s1.score <= s2.score
group by s1.id
order by `rank`

数据库函数

1.dense_rank() orve( 这里写 order by 的字段)
这个函数对排序的字段序号是并列的,而且和下一个不相同的字段序号的连续的
比如 123445 这里两个 4 排名相同,下一个接着是序号 5 没有断开

2.rank() over(这里写 order by 的字段)
这个函数是会和下个不相同的值断开的,会出现以下序号
123446 这里相同的排名就占了一个序号了

3.补充一个函数
row_number()