看到有人问:为啥已经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;