刷题记录 | 牛客网 SQL 编程题

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)*
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值