题解 | #未完成试卷数大于1的有效用户#

未完成试卷数大于1的有效用户

https://www.nowcoder.com/practice/46cb7a33f7204f3ba7f6536d2fc04286

having和select的执行顺序

having的执行顺序在select之前,所以having最好还是不要使用别名。

但是在mysql当中支持在having使用别名,但是最好不要用。这里用了是怕看走眼

使用group_concat()来计算detail列

group_concat(distinct concat_ws(':', date(start_time), tag) separator ';') 是一个复杂的SQL表达式,用于将特定列的值组合成一个字符串,并在不同值之间使用分隔符。

  1. date(start_time): 这部分是一个日期函数,用于从 start_time 列中提取日期部分。
  2. concat_ws(':', date(start_time), tag): 这是一个字符串拼接函数。它将两个或多个字符串连接在一起,使用冒号 ":" 作为分隔符。在这里,它将日期和tag两个值连接起来,中间用冒号分隔。
  3. distinct: 这是一个关键字,确保在最终的结果中不会包含重复的值。如果有多个行具有相同的连接结果,只会保留一个。
  4. group_concat(...):这是一个聚合函数,用于将分组内的值连接成一个字符串。在这里,它将distinct concat_ws(...)的结果连接在一起。
  5. separator ';': 这是用于指定连接后的字符串中不同值之间的分隔符。在这里,分隔符是分号 ";"。

综合起来,group_concat(distinct concat_ws(':', date(start_time), tag) separator ';') 的作用是将不同的日期和标签组合成一个字符串,确保没有重复的组合

select er.uid,
       sum(if(submit_time is null,1,0)) as incomplete_cnt,
       sum(if(submit_time is not null,1,0)) as complete_cnt,
       group_concat(distinct concat_ws(':',date(start_time),tag) separator ';') as detail
from exam_record er left join examination_info ei on er.exam_id = ei.exam_id 
where year(start_time)=2021
group by er.uid
having complete_cnt>=1 and incomplete_cnt<5 and incomplete_cnt>1
order by incomplete_cnt desc;

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 12:10
点赞 评论 收藏
分享
这算盘打的
程序员小白条:都这样的,都是潜规则,你自己说可以实习一年就行了,实习可以随便跑路的
点赞 评论 收藏
分享
机械打工仔:我来告诉你原因,是因为sobb有在线简历,有些HR为了快会直接先看在线简历,初步感觉不合适就不会找你要详细的了
投了多少份简历才上岸
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务