sql题-所有课程大于60分

题目

有三张表:

student学生表中属性有 id(int), student_name(varchar)

class课程表中属性有 id(int), class_name(varchar)

sc选课表中属性有 sid(int), cid(int), score(int)

一个学生可以选多门课,一门课可以有多个学生,每个课程分数都大于60分意味着这个学生得分最低的课程大于60分。

with t0 as (
select 1 as id,'yuxing01' as student_name
union all 
select 2 as id,'yuxing02' as student_name
union all 
select 3 as id,'yuxing03' as student_name
)
,t1 as (
select 1001 as id,'语文' as class_name 
union all 
select 1002 as id,'数学' as student_name
union all 
select 1003 as id,'英语' as student_name    
)
,t2 as (
select 1 as sid,1001 as cid,61 as score
union all 
select 1 as sid,1002 as cid,62 as score
union all 
select 1 as sid,1002 as cid,63 as score
union all 
select 2 as sid,1001 as cid,59 as score
union all 
select 2 as sid,1002 as cid,71 as score
union all 
select 3 as sid,1002 as cid,71 as score
union all 
select 3 as sid,1003 as cid,72 as score
)

这道题具有迷惑性,其实重点关注这个sc表就行了,其他属性后面再关联也行,同时要注意这个关键条件,是所有课程都要及格,只及格一个还是不够的,语兴这里列举4种不同办法(其他的懒得写了)

方法1关联

既然你要全部大于60分的人,那我们直接自关联筛选min大于60分的人就行了,因此直接join,就可以取出

select t0.student_name 
      ,t1.class_name 
from  t0  
join t2 
on t0.id = t2.sid 
join  (
    select sid
          ,min(score) as min_score 
    from t2 group by sid having min(score)>60 
    ) t3 
on t0.id = t3.sid
join t1
on t2.cid = t1.id 

yuxing01

语文

yuxing01

数学

yuxing01

数学

yuxing03

数学

yuxing03

英语

方法2数组排序

collect_list+sort_array 排序取第一位就行了,如果第一位都大于60后面的也不用考虑

select * from (
select sort_array(COLLECT_LIST(score))[0] as min_score
      ,sid
from t2
GROUP BY sid
) where min_score>60

61

1

59

2

71

3

方法3开窗

同理取first_value排序取第一位就行了,如果第一位都大于60后面的也不用考虑

select distinct sid from (
select FIRST_VALUE(score) over(PARTITION BY sid ORDER BY score asc) as min_score
      ,sid
from t2 
)
where min_score>60

1

3

方法4打标

只要课程大于60 我们就给他打标,再sum /课程数,如果为1说明都大于60了

select sum(is_60)/count( cid)
      ,sid
from (
SELECT if(score>60,1,0) as is_60
      ,sid
      ,cid
from t2
)
GROUP BY sid
having sum(is_60)/count( cid)=1

1

1

1

3

#你都收到了哪些公司的感谢信?##牛客创作赏金赛##数据开发工程师##数据人offer决赛圈怎么选##数据人的面试交流地#
全部评论

相关推荐

实习拷打1你对Excel数据做了如何处理,数据量有多大2.优化之前导入多长时长3.SQL优化做了什么东西4.SQL为什么走的慢,是没走索引吗?5.库里存的都是什么数据6.项目中有哪些出彩的地方,还有哪些地方可以做改进项目拷打1.介绍一下第一个项目2.为什么要把信息放到队列里面,为什么不是立即发3.为什么要使用服务的注册和发现,初衷是什么,服务谁来调用,自己练的时候是给谁发的,在哪块用的是注册和发现4..项目的工厂策略模式是怎么用的5.发短信如何发的,如何做到的6.什么情况下用到Redis分布式锁7.如果第一个人获取到锁,但是他执行失败了怎么办(setnx值写进去的话,别的服务读的话不会立马结束吗?不会锁在那等着,有什么好的方法去解决)我答的是用mq发消息去构建缓存,因为mq有消费者确认机制,消费失败重试,重试到一个阈值一直失败就换下一个服务面试官又问超过阈值也没成功怎么办(面试官说如果构建失败异常了,我继续发消息,直到有人处理成功我就不发消息了)8.介绍第二个项目9.用threadlocal干了什么10.zset的底层原理是什么,讲讲11.乐观锁和解决炒卖,分布式锁解决一人一单,这是怎么做的12.如果同时多个人查到的时候都有商品,都下单,这个如何控制防止超卖13.你用的jdk是什么版本14.讲讲g1的垃圾回收器的原理15.初始标记的时候干了什么16.并发标记做了什么17.怎么标记的,标记机制是什么18.并发标记之后会进入的哪个阶段,为什么会有重新标记,解决了什么问题19.重新标记结束后会进入到哪个阶段20.你用过哪些锁21.reentrantlock是如何实习线程重入22.用过线程池吗?23.我们为什么要使用线程池24.核心线程数和最大线程数我们如何设置最合理手撕:在排序数组中查找元素的第一个和最后一个位置
点赞 评论 收藏
分享
评论
2
2
分享

创作者周榜

更多
牛客网
牛客企业服务