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

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

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 新疆

相关推荐

10-31 21:01
武汉大学 Java
lulululula...:仅仅按我个人的经历来看,大厂其实很少特别关注微服务,一般对微服务架构,限流熔断降级的概念了解就行,简历不写也不容易被问到。现在这个势头不如站点agent应用,比如做做mcp,rag,r对话agent,记忆管理之类的,说不定可以蹭上一波热度,进公司虽然可能还是干agent的杂活,但是可以学一学组内的业务和技术了
点赞 评论 收藏
分享
评论
45
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务