题解 | #牛客每个人最近的登录日期(二)#
牛客每个人最近的登录日期(二)
http://www.nowcoder.com/practice/7cc3c814329546e89e71bb45c805c9ad
先确定思路: 在login表中对用户id进行分区后取日期最大的那条数据,然后连接另外两张表,或者是反过来,先连接表再进行查询(这一点就没试了)。 然后是实现:
第一种:笨方法,先在login表对用户id进行分区后只返回用户id和最大的日期,然后与原表进行连接,原表为主表,确定用户最近登录的那条数据,再连接其它两张表,确定用户名和设备名,最后按用户名进行升序排序。 代码:
select c.name,d.name,a.date from login a
join (select user_id,max(date) date from login group by user_id) b
on a.user_id=b.user_id
join user c on a.user_id=c.id
join client d on a.client_id=d.id
where a.date=b.date order by c.name
第二种:使用窗口函数,对用户id进行分区后按日期返回第一条数据,然后就是与另外两张表进行连接,最后排序。 代码:
select b.name,c.name,a.date from (
select user_id,client_id,date,
rank() over(partition by user_id order by date desc) num
from login) a
join user b on a.user_id=b.id
join client c on a.client_id=c.id
where a.num=1 order by b.name

美团成长空间 2667人发布