SQL38 筛选限定昵称成就值活跃日期的用户
题目主要信息:
- 找到昵称以『牛客』开头『号』结尾、成就值在 1200~2500 之间,且最近一次活跃(答题或作答试卷)在 2021 年 9 月的用户信息
- 输出 uid, nick_name, achievement 字段
问题拆解:
- 通过 WITH AS 语句从多个表中筛选符合要求的用户信息。知识点:LIKE, BETWEEN, AND, UNION, MAX
- nick_name LIKE "牛客%号" 筛选出昵称以『牛客』开头『号』结尾的用户
- achievement BETWEEN 1200 AND 2500 筛选出成就值在 1200~2500 之间的用户,通过 AND 逻辑符号和第一条筛选规则连接
- 通过 MAX(DATE_FORMAT(start_time ,"%Y%m"))="202109" 分别从 exam_record 和 prectice_record 中筛选出最后一次活跃在 2021 年 9 月的用户,使用 UNION 将二者拼接
- 将上述两个临时表 JOIN 起来,输出题目所需的字段。知识点:JOIN
代码:
WITH
valid_u AS (SELECT * FROM user_info WHERE nick_name LIKE "牛客%号" AND achievement BETWEEN 1200 AND 2500),
valid_e AS (SELECT uid FROM exam_record GROUP BY uid HAVING MAX(DATE_FORMAT(start_time ,"%Y%m"))="202109"),
valid_p AS (SELECT uid FROM practice_record GROUP BY uid HAVING MAX(DATE_FORMAT(submit_time ,"%Y%m"))="202109")
SELECT
valid_u.uid,
nick_name,
achievement
FROM
valid_u
JOIN
(SELECT * FROM valid_e UNION SELECT * FROM valid_p) AS valid_uid
ON valid_u.uid = valid_uid.uid