• 条件:2021年每个未完成试卷作答数大于1的有效用户的数据(有效用户指完成试卷作答数至少为1且未完成数小于5)

    • 2021年用where
    where YEAR(start_time) = 2021 
    
    • 未完成试卷作答数:无submit_time或者无score。用if函数。
    select sum(if(submit_time is null, 1, 0)) as incomplete_cnt
        , sum(if(submit_time is null, 0, 1)) as complete_cnt
    
  • 有效用户:完成试卷作答数至少为1且未完成数小于5。用having做筛选。

    having incomplete_cnt<5
    and complete_cnt >= 1
    
  • 未完成试卷作答数大于1:

    having incomplete_cnt > 1
    
  • 输出结果:

    • detail列:作答完成的试卷的日期和类型。用concat()连接?看了大神的答案才知道可以有个group_concat()函数。
    • group_concat([distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'])
    • 通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。
    group_concat(distinct CONCAT(DATE_FORMAT(start_time, '%Y-%m-%d'),':',tag) separator ';')
    
  • 整理之后得到:

    select uid
            , sum(if(submit_time is null, 1, 0)) as incomplete_cnt
            , sum(if(submit_time is null, 0, 1)) as complete_cnt
            , group_concat(distinct CONCAT(DATE_FORMAT(start_time, '%Y-%m-%d'),':',tag) separator ';') as detail
    from exam_record er join examination_info ei on er.exam_id = ei.exam_id
    where YEAR(start_time) = 2021 
    group by uid
    having incomplete_cnt>1
    and incomplete_cnt<5
    and complete_cnt >= 1
    order by incomplete_cnt desc