题解 | #每份试卷每月作答数和截止当月的作答总数。#

每份试卷每月作答数和截止当月的作答总数。

http://www.nowcoder.com/practice/5f1cbe74c682485aa73e4c2b30f04a62

看到有人问:为啥已经GROUP BY 了,在窗口函数中还要用到PARTITION BY?其实是因为少走了一步,我用一个子查询解释下。

把少走的那一步补充完整是这样的:先用group by求前3个字段作为一个表,再用窗口函数+子查询查逐月累计。
  • STEP1:先求前3个字段。
SELECT exam_id,DATE_FORMAT(start_time,'%Y%m') start_month, COUNT(start_time) month_cnt
FROM  exam_record
GROUP BY exam_id,start_month
/先求前3个字段/

  • STEP2:在用子查询求cum_exam_cnt
SELECT *,SUM(month_cnt)OVER(PARTITION BY exam_id ORDER BY start_month) cum_exam_cnt
FROM (
	SELECT exam_id,DATE_FORMAT(start_time,'%Y%m')start_month, COUNT(start_time) month_cnt
	FROM  exam_record
	GROUP BY exam_id,start_month
)t1
直接一步走的解题方式
SELECT exam_id,DATE_FORMAT(start_time,'%Y%m')start_month, COUNT(start_time) month_cnt,
SUM(COUNT(start_time))OVER(Partition by exam_id ORDER BY DATE_FORMAT(start_time,'%Y%m'))cum_exam_cnt
FROM  exam_record
GROUP BY exam_id,start_month;

SQL解题集 文章被收录于专栏

这是牛客SQL相关的解题集

全部评论
select执行顺序不是在group by之后吗?为甚么可以直接GROUP BY exam_id,start_month;呢?这里面的start_month还没出现啊
2 回复 分享
发布于 2022-05-04 20:19
虽然我是用的方法二做的,但还是有疑惑。聚合函数是不能嵌套使用的,在窗口函数就可以了,为啥呢?
1 回复 分享
发布于 2023-03-08 12:46 新疆

相关推荐

鬼迹人途:你去投一投尚游游戏,服务器一面,第一个图算法,做完了给你一个策略题,你给出方案他就提出低概率问题,答不上当场给你挂
点赞 评论 收藏
分享
04-29 22:35
门头沟学院 Java
牛友说改了名字能收到offer:旧图新发查看图片
点赞 评论 收藏
分享
评论
41
5
分享

创作者周榜

更多
牛客网
牛客企业服务