题目
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 =2177. 第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
);
END178. 分数排名
+-------------+---------+
| 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()