- 计算sql试卷未完成率,并用ROW_NUMBER()OVER()对其进行排名
SELECT uid,
ROW_NUMBER()OVER(ORDER BY incomplete_rate DESC, uid DESC) AS incomplete_rank
FROM (
SELECT uid,
incomplete_cnt / total_cnt AS incomplete_rate
FROM (
SELECT uid,
COUNT(CASE WHEN tag = 'SQL' AND submit_time IS NULL
THEN exam_id END) AS incomplete_cnt,
COUNT(CASE WHEN tag = 'SQL' THEN exam_id END) AS total_cnt
FROM exam_record JOIN
examination_info USING(exam_id)
GROUP BY uid
)cnt_table
)rate_table
)rank_table
- 计算作答试卷的总人数
SELECT COUNT(DISTINCT uid) AS total_user
FROM exam_record
-
计算sql试卷未完成率较高的50%的用户:incomplete_rank <= ceiling(total_user / 2)
-
完整代码如下:
SELECT uid, start_month,
COUNT(start_time) AS total_cnt,
COUNT(submit_time) AS complete_cnt
FROM (
SELECT uid, exam_id, start_time, submit_time, total_user,
DATE_FORMAT(start_time, '%Y%m') AS start_month,
DENSE_RANK()OVER(PARTITION BY uid ORDER BY DATE_FORMAT(start_time, '%Y%m') DESC) AS recent_months_rank
FROM exam_record JOIN (
SELECT uid,
ROW_NUMBER()OVER(ORDER BY incomplete_rate DESC, uid DESC) AS incomplete_rank
FROM (
SELECT uid,
incomplete_cnt / total_cnt AS incomplete_rate
FROM (
SELECT uid,
COUNT(CASE WHEN tag = 'SQL' AND submit_time IS NULL
THEN exam_id END) AS incomplete_cnt,
COUNT(CASE WHEN tag = 'SQL' THEN exam_id END) AS total_cnt
FROM exam_record JOIN
examination_info USING(exam_id)
GROUP BY uid
)cnt_table
)rate_table
)rank_table USING(uid) JOIN (
SELECT COUNT(DISTINCT uid) AS total_user
FROM exam_record
)user_table
WHERE incomplete_rank <= ceiling(total_user / 2)
AND uid IN (
SELECT uid
FROM user_info
WHERE level BETWEEN 6 AND 7
)
)recent_month_table
WHERE recent_months_rank <= 3
GROUP BY uid, start_month
ORDER BY uid, start_month