sql语句 根据时间对字段数据累加+一张成绩表(姓名)(班级)(成绩)三个字段,要求写个sql语句选择出不同班级的成绩前三名的学生的信息

1  在一次报表开发任务中遇到这么一个需求,要求统计用户截止每天的发布文章的所有数量,例如 :

日期文章(篇)
2022-01-0120
2022-01-0216
2022-01-0332
2022-01-0418

那么统计出的报表数据应如下:

日期文章(篇)总计
2022-01-012020
2022-01-021636
2022-01-033268
2022-01-041886

显然使用普通的 group by 是不能满足需求的,应考虑自连接:

SELECT aa.日期, aa.数值, SUM(lj.数值) AS 累计
FROM tb lj INNER JOIN
(SELECT *    FROM tb) aa ON lj.日期 <= aa.日期
WHERE (aa.日期 <= '2005-05-04')  
GROUP BY aa.日期, aa.数值
ORDER BY aa.日期

2 有一张成绩表(姓名)(班级)(成绩)三个字段,要求写个sql语句选择出不同班级的成绩前三名的学生的信息

 同样我们可以使用自连接加上限制条件来筛选:


 SELECT * FROM class A LEFT JOIN class B ON A.class = B.class AND A.grade < B.grade 

 此时的结果还不是我们需求的结果,该SQL可以理解成,排列出了所有比同一班级下任意学生的成绩低的学生信息,如:初二年级比John成绩低的只有乔治,初一年级比curry成绩低的有欧文和保罗,初一年级比杜兰特成绩低的有curry,欧文,保罗,只要在这个排列中的信息出现超过了2次(包括两次),说明有同一班级超过两个学生的成绩高于该学生,代表该学生的信息已经掉出了前两名开外了,我们使用group by + having来进行分组,聚合过滤

 SELECT *,count(*) FROM class A LEFT JOIN class B ON A.class = B.class AND A.grade < B.grade 
 GROUP BY A.class,A.student,A.grade

 最后我们再添加having,再排序,取出我们需求的结果

SELECT A.class,A.student,A.grade FROM class A LEFT JOIN class B ON A.class = B.class AND A.grade < B.grade 
 GROUP BY A.class,A.student,A.grade
 HAVING count(*) < 2
 ORDER BY class,grade DESC

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值