《SQL面试50题》刷题笔记 day7(知识点:函数group_concat()、开窗函数lead、内联结)

今天可以不用加班,出去溜达了一圈还略微迷路了。。哈哈哈

问题9 查询和"01"号的同学学习的课程完全相同的其他同学的信息(正确解法在下面)
这个题网上答案就是针对这个表的数据做查询,不能推广。

下面给出我搜到的一个答案,这个查询是通过选择与学号01的学生课程数量相同的学生 的信息。

select student.*
from student
where sid in (select sid from score group by sid having count(cid) = (select count(cid) from score where sid ='01')
 and sid<> '01');

这个题也不能用lead开窗函数做,因为也不能推广。

select * 
from student 
where sid in
 	(select b.sid from
 	(select sid, cid, lead(cid,1) over(partition by sid order by cid) cid2, 
 			lead(cid,2) over(partition by sid order by cid) cid3 from score) a,
 	(select sid, cid, lead(cid,1) over(partition by sid order by cid) cid2, 
 			lead(cid,2) over(partition by sid order by cid) cid3 from score) b
	where a.cid=b.cid and a.cid2=b.cid2 and a.cid3=b.cid3 and a.sid='01') 
 		--a表筛选出来学号sid=01的学生,b表找符合要求的学生
and sid not in('01')--排除掉学号01学生自身;

这个查询的思路是 考虑到学号01的学生以及课程表course只有cid为01 02 03的三门课,用lead开窗函数把所有学生的 每门课成绩作为新的字段,用学生01的每门课的成绩与其余行的对应成绩对比。
其中,由lead创建的新的表的语句和运行结果如下:

select sid, cid, 
lead(cid,1) over(partition 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值