1. 刷题通过的题目排名
select id, number, dense_rank()over(order by number desc) as rank
from passing_number
order by number desc, id asc;
注意:题目要求的排名是 1 2 2 3 稠密排名,所以用 dense_rank() 函数。
2. 出现三次以上积分相同的number
select number from grade
group by number
having count(number) >= 3;
3. 找到每个人的任务
select p.id, p.name, t.content
from person p
left join task t
on p.id = t.person_id
order by p.id asc;
题目要求person表中所有的id都要有,所以这个时候用 left join。
4. 每门课程考试前2名的学生
select id, name, score
from
( select g.id, l.name, g.score, dense_rank() over( partition by language_id order by score desc) as ranking
from grade g
join language l
on g.language_id = l.id
)
where ranking <= 2
order by name,score desc, id;
思路:既然考到了名次,那么首先想到的是用窗口函数中的排名函数。如果取前二名,直接用where判断即可。
注意:
- 题目给出排序的条件有三个。注意写法。
- 这里的排名函数只有用 dense_rank() 的时候才给通过,其余两个都会报错,大概是要考虑了分数相同的两个人要属于同一个名次,且不影响第二名。
5. 邮件异常的概率
要计算每天邮件异常的概率。条件是正常用户发给正常用户中成功的,所以要关联表,提出掉黑名单里的用户。
select t.date,
round(sum( case when t.type='no_completed' then 1 else 0 end)*