题解 | #牛客每个人最近的登录日期(二)#

牛客每个人最近的登录日期(二)

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

partition by和group by对比

全部评论

相关推荐

做黑夜里的那道光:两年电赛完赛没必要写,纯扣分
双非本科求职如何逆袭
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务