sql
student表 字段: stu_id 学生id 、stu_name 学生姓名、grade 成绩
calss表、字段: cla_id 班级id、cla_name 班级名称、stu_id 学生id
**结果表字段:班级名称,每个班级前5%的学生名单,前5%学生成绩
其中,每个班级学生成绩无重复人数大于5,计算5%时若非整数向上取整。
每个班级前5%的学生名单前5%学生成绩,计算5%时若非整数向上取整怎么写?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
关注 分析:
- 题目中没说前5%的排序依据,不清楚是指总分占比还是指分数排名的前5%,这里假设是按分数倒序排名,排名占人数的占比为前5%,
即如果班级是20人,那么就只要找出1人,而低于20人时,向上取整皆为只取一人 - 题目中没有指定数据库及版本,不同数据库的语法是有区别的,但由于目前大部分数据库均已支持开窗函数,因此结合第一点,给出下面的sql
select x.cla_name,x.stu_name,x.grade from ( select c.cla_name,s.stu_name,s.grade, ROW_NUMBER() OVER(PARTITION BY c.cla_id order by s.grade desc) rn, count(1) OVER(PARTITION BY c.cla_id ) ct from student s,class c where s.stu_id=c.stu_id ) x where ( (ct > 20 and rn/ct<=0.05 ) or (ct <= 20 and rn=1) )
如果是指每班输出人数大于5的话,用下面这个
select x.cla_name,x.stu_name,x.grade from ( select c.cla_name,s.stu_name,s.grade, dense_rank() OVER(PARTITION BY c.cla_id order by s.grade desc) rk, count(1) OVER(PARTITION BY c.cla_id ) ct from student s,class c where s.stu_id=c.stu_id ) x where ( (rk<=6 or cell(rk/ct*100)<=5 )
能不能把你的create table 和数据的insert发出一下?
题目要求是无重复且大于5人,dense_rank排行就是重复分排行一样,且排名递增为1。
然后排行为前5%,你题目中并没有说这个5%是要怎么计算得到的,光排序排名至少就有3种方式取前5%,分数占比排名也至少有2种方式取前5%,因此在题目不明确的情况下,选择和前面一致的dense_rank,下面的sql稍微改了一下分母的取值select x.cla_name,x.stu_name,x.grade from ( select c.cla_name,s.stu_name,s.grade, dense_rank() OVER(PARTITION BY c.cla_id order by s.grade desc) rk, count(distinct x.grade) OVER(PARTITION BY c.cla_id ) ct from student s,class c where s.stu_id=c.stu_id ) x where ( (rk<=6 or cell(rk/ct*100)<=5 )
解决 1无用- 题目中没说前5%的排序依据,不清楚是指总分占比还是指分数排名的前5%,这里假设是按分数倒序排名,排名占人数的占比为前5%,
悬赏问题
- ¥15 WPF动态创建页面内容
- ¥15 如何对TBSS的结果进行统计学的分析已完成置换检验,如何在最终的TBSS输出结果提取除具体值及如何做进一步相关性分析
- ¥15 SQL数据库操作问题
- ¥100 关于lm339比较电路出现的问题
- ¥15 Matlab安装yalmip和cplex功能安装失败
- ¥15 加装宝马安卓中控改变开机画面
- ¥15 STK安装问题问问大家,这种情况应该怎么办
- ¥15 关于罗技鼠标宏lua文件的问题
- ¥15 halcon ocr mlp 识别问题
- ¥15 已知曲线满足正余弦函数,根据其峰值,还原出整条曲线