这道题目要求我们查询每天最早登录的用户及其内容喜好。我们要做的事情如下:
1. 确定总体问题
我们需要找出每一天最早登录的用户,并输出他们的登录日期、用户ID和内容喜好,并按日期升序排序,如果当天出现多个用户同时最早登录,那么这些用户均需要输出。
2. 分析关键问题
- 找出每天最早的登录时间:从
login_tb
中提取每一天的最早登录时间。 - 获取最早登录用户的信息:根据最早登录时间找到对应的用户。
- 连接用户信息:将最早登录的用户与
user_action_tb
表连接,以便获取用户的内容喜好。 - 排序输出:按登录日期升序排序。
3. 解决每个关键问题的代码及讲解
步骤1:找出每天最早的登录时间
我们使用WITH
子句创建一个临时表earliest_logins
,找出每一天的最早登录时间:
WITH earliest_logins AS (
SELECT
DATE(log_time) AS log_day,
MIN(log_time) AS earliest_time
FROM
login_tb
GROUP BY
DATE(log_time)
)
DATE(log_time) AS log_day
:提取登录日期。MIN(log_time) AS earliest_time
:找出每一天(同一组)的最早登录时间。GROUP BY DATE(log_time)
:按日期分组。
步骤2:获取最早登录用户的信息
我们将earliest_logins
与login_tb
表连接,获取最早登录用户的信息:
SELECT
e.log_day,
u.user_id,
u.hobby
FROM
earliest_logins e
JOIN
login_tb l ON l.log_time = e.earliest_time
login_tb l ON l.log_time = e.earliest_time
:通过最早登录时间连接,获取最早登录的用户。
步骤3:连接用户信息
我们将最早登录的用户与user_action_tb
表连接,以便获取用户的内容喜好:
JOIN
user_action_tb u ON u.user_id = l.user_id
JOIN user_action_tb u ON u.user_id = l.user_id
:通过用户ID连接,获取用户的内容喜好。
步骤4:排序输出
我们使用ORDER BY
按登录日期升序排序输出结果:
ORDER BY
e.log_day;
完整代码
WITH earliest_logins AS (
SELECT
DATE(log_time) AS log_day,
MIN(log_time) AS earliest_time
FROM
login_tb
GROUP BY
DATE(log_time)
)
SELECT
e.log_day,
u.user_id,
u.hobby
FROM
earliest_logins e
JOIN
login_tb l ON l.log_time = e.earliest_time
JOIN
user_action_tb u ON u.user_id = l.user_id
ORDER BY
e.log_day;