用rank()over() 做排序再取值select name, t.tpye, t.ldate from ( select u.name, c.name tpye, max(l.date) ldate, rank() over ( partition by u.name order by l.date desc ) posn from login l left join user u on l.user_id = u.id left join client c on l.client_id = c.id group by u.name, c.name, l.date ) t where t....