题解 | #未完成试卷数大于1的有效用户#(有一些纰漏,还请担待一些)
未完成试卷数大于1的有效用户
http://www.nowcoder.com/practice/46cb7a33f7204f3ba7f6536d2fc04286
这题我的问题是:
1.detail 如何插入多个数据 其中包含里面的 日期和tag
最后看完答案找到的解决思路。
写 detail 的思路是先用 concat 将日期对应的tag一并提取出来,然后对他们进行 ,其中distinct 是用来 对取出的数据进行区分的
因为有可能会出现 某一张试卷在同一天被做过之后 然后又不小心被自己打开(原因之一),但是因为做过不想浪费时间就没有做,导致试卷一直搁置在哪里了
再使用 group_concat 来进行分组 分组是依据的 uid为条件进行的分组。和第二种的区别只是少了一个 order by
----------------------------------------------------------------------------------------------------------------
#
select uid,
count(ww) as incomplete_cnt,
count(pp) as complete_cnt,# 这行我刚开始是直接选择用score去求,因为count 是具有去null的作用的,但是看输入案例发现有一列 1003 9001有个小BUG有分无提交时间 但是我们是按照submit_time来区分的,所以就出现了错误
# concat(data_format(start_time,'%Y%m%d'),':',tag)
GROUP_CONCAT(distinct CONCAT(DATE_FORMAT(start_time,'%Y-%m-%d'),':',tag) order by start_time SEPARATOR ";") as detail
#↓----↓----↓----↓----↓----↓----↓第二种快一些的取出具体日期的方法↓----↓----↓----↓----↓----↓----↓----↓----↓----↓----↓----↓----↓----↓
# group_concat(distinct concat_ws(':', date(start_time), tag) SEPARATOR ';') as detail
from
(
select uid,score,
case when submit_time is null then 1 else null end as ww,
case when submit_time is not null then 1 else null end as pp,
tag,
start_time
from exam_record er
left join examination_info ei on er.exam_id = ei.exam_id
) a# 其实也可以使用 连接直接取出数据了,但是我为了 方便理解一些 选择了这种方法:就是先做出一个新的表格,里面包含了题干要求的信息,
# 然后我再在这个新表里面取出我想要取出的数据
where year(start_time) = '2021' # 写的时候还少了这行 老是忘记了这个条件
group by uid
having incomplete_cnt > 1 and complete_cnt >=1 and incomplete_cnt <5 # 本来这两行只写有一行 where,然而where 是不能使用新的列名的,这个我给忘了,需要使用having ing嘛说明是可以使用表格里面的新列名的。
order by uid desc