一、明确需求:
- 时间:2021年每月
- month_q_cnt = 该月刷题记录总数
- month_q_cnt = 用户总刷题数/该月总天数
- 2021汇总列
二、逻辑思路
- 用year(submit_time) =2021筛选数据
- 用date_format()提取‘年-月’字段作为后续分组条件,day(last_day())提取该月天数,作为后续mon_q_cnt计算
- 以年-月为分组条件,计算刷题总数和日均刷题数
- 以年为分组条件,计算汇总行,union合并3得到的结果
- 以submit_month为排列条件
with
#选择2021,提取年,年-月,该月总天数
t1 as
(select distinct *
, year(submit_time) y
, day(last_day(submit_time)) d
, date_format(submit_time,'%Y%m') y_m
from practice_record
where year(submit_time) =2021
),
# 以年-月为分组条件,计算月答题数和日均答题数
t2 as
(select y_m
, count(1) m_cnt
, round(count(1)/avg(d),3) avg_d
from t1
group by y_m)
#union联结汇总行
select y_m submit_month
, m_cnt month_q_cnt
, avg_d avg_day_q_cnt
from t2
union
select '2021汇总',sum(m_cnt),round(sum(m_cnt)/31,3) avg_d_q
from t2
order by submit_month
拓展: 计算每个月的总天数:day(last_day(日期))