题解 | #月总刷题数和日均刷题数#
月总刷题数和日均刷题数
http://www.nowcoder.com/practice/f6b4770f453d4163acc419e3d19e6746
该题目主要考察的应该是group by
函数和union
来连接结果。
SQL的思路:按照每个月份来分组,通过月份来获取每个月份有多少天;对于汇总的结果,则可以使用类似行列转换的方式来实现。 还是上代码吧!
SELECT T.month submit_month, T.month_q_cnt, ROUND(T.month_q_cnt/DATE_FORMAT(last_d, '%d'), 3) avg_day_q_cnt
FROM (
SELECT DATE_FORMAT(submit_time, '%Y%m') month,COUNT(question_id) month_q_cnt,LAST_DAY(submit_time) last_d
FROM practice_record
WHERE DATE_FORMAT(submit_time, '%Y')='2021'
GROUP BY DATE_FORMAT(submit_time, '%Y%m'),LAST_DAY(submit_time)) T
UNION ALL
SELECT CASE WHEN T22.submit_month IS NOT NULL THEN CONCAT(T22.submit_month,'汇总') ELSE NULL END submit_month, T22.month_q_cnt, ROUND(T22.avg_day_q_cnt, 3)
FROM (
SELECT SUBSTRING(T1.month, 1, 4) submit_month, SUM(T1.month_q_cnt) month_q_cnt, SUM(T1.avg_day_q_cnt) avg_day_q_cnt
FROM (
SELECT T.month, T.month_q_cnt, T.month_q_cnt/31 avg_day_q_cnt
FROM (
SELECT DATE_FORMAT(submit_time, '%Y%m') month,COUNT(question_id) month_q_cnt
FROM practice_record
WHERE DATE_FORMAT(submit_time, '%Y')='2021'
GROUP BY DATE_FORMAT(submit_time, '%Y%m')) T) T1
GROUP BY SUBSTRING(T1.month, 1, 4)) T22
ORDER BY submit_month
PS:为啥临时表使用T1,T22呢?主要是看了今年的MSI,觉得有点意思。
顺便提一嘴,牛客的结果判定感觉不够智能,不加ORDER BY
函数的时候,结果的内容是没错的,但是结果的顺序跟所谓的预期结果不一致,测试用例显示不通过。回头再细细品了一下题目,并没有要求结果按照月份顺序。因此觉得这样体验不是很好。