题解 | #分别满足两个活动的人#

分别满足两个活动的人

https://www.nowcoder.com/practice/a126cea91d7045e399b8ecdcadfb326f

SELECT * FROM 
(SELECT uid, 'activity1' activity
FROM exam_record
WHERE YEAR(submit_time) = 2021
GROUP BY uid
HAVING  MIN(score) >= 85) a

UNION ALL

SELECT * FROM 
(SELECT distinct uid, 'activity2' activity
FROM examination_info
    JOIN exam_record
    USING(exam_id)
WHERE YEAR(submit_time) = 2021 AND difficulty = 'hard' AND score > 80 AND TIMESTAMPDIFF(SECOND, start_time, submit_time)  < duration * 30
GROUP BY uid) b

ORDER BY uid

这道题真是急死我了,看着至少有一次就不知道该怎么做了,这不就是存在嘛。

分别满足两个条件,可以理解为分别从两张表查询。

每次试卷得分都能到85分的人(activity1):那就是每次考试得分都大于等于85分的,直接用大于等于也不行,因为有可能只是一次考试爆发了,这个限制可以用求这个人考试分数的最小值,最小值都等于85了,那肯定满足。所以需要聚合函数

至少有一次用了一半时间就完成高难度试卷且分数大于80的人(activity2):联结两张表,使用TIMESTAMPDIFF()函数计算时间差,再实现其他的限制条件。

TIMESTAMPDIFF(unit, start_date, end_date)

参数说明:

unit:表示差值的单位,可以是以下值之一:MICROSECOND(微秒)、SECOND(秒)、MINUTE(分)、HOUR(小时)、DAY(天)、WEEK(周)、MONTH(月)、QUARTER(季度)或 YEAR(年)。

start_date:表示时间段的起始时间。

end_date:表示时间段的结束时间。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务