这道题目要求我们查询每个用户最近一次登录的日期和所使用的设备,我们要做的事情如下:
1. 确定总体问题
我们需要查询每个用户最近一次登录的日期和所使用的设备,并按用户的名字升序排序。即需要从登录记录表、用户表和客户端表中提取数据,通过用户ID和客户端ID进行连接,并使用窗口函数ROW_NUMBER
来获取每个用户的最近登录记录。
2. 分析关键问题
- 连接表:将
login
、user
和client
表连接起来,以便获取每个用户的登录信息和设备信息。 - 为每个用户的登录记录分配排名:使用
ROW_NUMBER
窗口函数为每个用户的登录记录分配排名,按日期降序排列。 - 筛选最近一次登录记录:通过
WHERE
子句筛选出排名为1的记录,即最近一次登录记录。 - 排序输出:按用户的名字升序排列输出结果。
3. 解决每个关键问题的代码及讲解
步骤1:连接表
我们使用JOIN
将login
、user
和client
表连接起来:
from
login l
join user u on l.user_id = u.id
join client c on c.id = l.client_id
JOIN user u ON l.user_id = u.id
:通过用户ID连接登录记录表和用户表。JOIN client c ON c.id = l.client_id
:通过客户端ID连接登录记录表和客户端表。
步骤2:为每个用户的登录记录分配排名
我们使用ROW_NUMBER
窗口函数为每个用户的登录记录分配排名,按日期降序排列:
row_number() over(partition by u.id order by date desc) as rk
ROW_NUMBER() OVER (PARTITION BY u.id ORDER BY date DESC) AS rk
:为每个用户的登录记录分配排名,按日期降序排列。
步骤3:筛选最近一次登录记录
我们通过WHERE
子句筛选出排名为1的记录,即最近一次登录记录:
where rk = 1
WHERE rk = 1
:筛选出排名为1的记录,即最近一次登录记录。
步骤4:排序输出
我们按用户的名字升序排列输出结果:
order by u_n
ORDER BY u_n
:按用户的名字升序排列。
完整代码
select
u_n,
c_n,
date
from(
select
u.name as u_n,
c.name as c_n,
l.date,
row_number() over(partition by u.id order by date desc) as rk
from
login l
join user u on l.user_id = u.id
join client c on c.id = l.client_id
) s
where rk = 1
order by u_n;