题解 | #验证刷题效果,输出题目真实通过率#
验证刷题效果,输出题目真实通过率
https://www.nowcoder.com/practice/c4fd4b545a704877b510f18503ad523f
WITH UserQuestionStats AS ( -- 子查询部分,统计每个用户相关的指标基础数据 SELECT user_id, -- 统计通过题目数量(去重,按照题目只计一次通过的逻辑) COUNT(DISTINCT CASE WHEN result_info = 1 THEN question_id END) AS passed_questions_distinct, -- 统计总题目数量(去重) COUNT(DISTINCT question_id) AS total_questions_distinct, -- 统计通过题目数量(不去重) SUM(CASE WHEN result_info = 1 THEN 1 ELSE 0 END) AS passed_questions_not_distinct, -- 统计总提交次数 COUNT(*) AS total_submissions FROM done_questions_record GROUP BY user_id ) -- 主查询,基于上面统计好的数据计算比率并筛选结果 SELECT user_id, -- 计算题目通过率 passed_questions_distinct / total_questions_distinct AS question_pass_rate, -- 计算提交正确率 passed_questions_not_distinct / total_submissions AS pass_rate, -- 计算每题目平均提交次数 total_submissions / total_questions_distinct AS question_per_cnt FROM UserQuestionStats WHERE passed_questions_distinct / total_questions_distinct > 0.6 ORDER BY user_id ASC;
理解题意实在太困难了,可见程序员和产品经理之间的Gap有多大~
由于运算逻辑较为复杂,建议使用公共表达式(common table expressions)来提高代码可读性和可维护性