题解 | #分别满足两个活动的人#
分别满足两个活动的人
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:表示时间段的结束时间。