题解 | #月总刷题数和日均刷题数#
月总刷题数和日均刷题数
https://www.nowcoder.com/practice/f6b4770f453d4163acc419e3d19e6746
做的时候一直在报group by的错误。
avg(day (LAST_DAY (submit_time)))
- LAST_DAY(submit_time):这是一个日期函数,用于获取 submit_time 列中每个日期的最后一天。例如,如果 submit_time 包含 "2023-09-15",那么 LAST_DAY(submit_time) 将返回 "2023-09-30",即该日期所在月份的最后一天。
- day(LAST_DAY(submit_time)):这是另一个日期函数,用于从日期中提取天数部分。对于 "2023-09-30",这将返回 30。
- avg(day(LAST_DAY(submit_time))):这是平均函数,用于计算指定表达式的平均值。在这里,它计算的是所有提交时间的最后一天的天数的平均值。
所以,关键在什么呢?就在于加了一个avg()聚合。
如果不加avg(),那我们必须在group by当中包含没有聚合的列名。day()函数返回的就是一个天数(例如30),加不加avg返回的都是这个值
关键代码:
select DATE_FORMAT (submit_time, '%Y%m') as submit_month, count(submit_time) as month_q_cnt, round(count(submit_time) / avg(day (LAST_DAY (submit_time))), 3) as avg_day_q_cnt from practice_record where score is not null and year (submit_time) = '2021' group by DATE_FORMAT (submit_time, '%Y%m') union all select '2021汇总' as submit_month, count(submit_time) as month_q_cnt, round(count(submit_time) / 31, 3) as avg_day_q_cnt -- /30 会不通过用例 from practice_record where score is not null and year (submit_time) = '2021' order by submit_month;