解题思路:
分别给出两种情况下会出现的结果,再筛选出所有结果并去重。
1.计算0级用户未完成试卷数与未完成率(保留3位小数)
2.所有有作答记录的用户的未完成试卷数与未完成率(保留3位小数)
3.筛选出所有结果并去重。
步骤:
1.计算0级用户未完成试卷数与未完成率(保留3位小数)
select
a.uid,
sum(if(score is null and start_time is not null,1,0)) incomplete_cnt1,
round(sum(if(score is null and start_time is not null,1,0)) / count(if(start_time is null,0,1)),3)incomplete_rate1
from user_info a
left join exam_record b
on a.uid=b.uid
where level=0
group by a.uid
2.所有有作答记录的用户的未完成试卷数与未完成率(保留3位小数)
select
uid,
sum(if(score is null,1,0)) incomplete_cnt2,
sum(if(score is null,1,0)) / count(start_time) incomplete_rate2
from exam_record
group by uid
3.筛选出所有结果并去重。
distinct if((select max(incomplete_cnt1)>2 from t1),t1.uid,t2.uid) uid,
if((select max(incomplete_cnt1)>2 from t1),t1.incomplete_cnt1,t2.incomplete_cnt2) incomplete_cnt,
if((select max(incomplete_cnt1)>2 from t1),t1.incomplete_rate1,t2.incomplete_rate2) incomplete_rate
完整代码
with t1 as (
select
a.uid,
sum(if(score is null and start_time is not null,1,0)) incomplete_cnt1,
round(sum(if(score is null and start_time is not null,1,0)) / count(if(start_time is null,0,1)),3)incomplete_rate1
from user_info a
left join exam_record b
on a.uid=b.uid
where level=0
group by a.uid
),
t2 as (
select
uid,
sum(if(score is null,1,0)) incomplete_cnt2,
sum(if(score is null,1,0)) / count(start_time) incomplete_rate2
from exam_record
group by uid
)
select
distinct if((select max(incomplete_cnt1)>2 from t1),t1.uid,t2.uid) uid,
if((select max(incomplete_cnt1)>2 from t1),t1.incomplete_cnt1,t2.incomplete_cnt2) incomplete_cnt,
if((select max(incomplete_cnt1)>2 from t1),t1.incomplete_rate1,t2.incomplete_rate2) incomplete_rate
from t1,t2
order by incomplete_rate