方法1:group by
字段问题通过join解决
方法2:over partition by
select * from ( select tmp.*, row_number() over(PARTITION BY 分组字段 order by 排序字段 desc) as rn from 表名 tmp ) where rn = 1
方法3:join
- SQL
SELECT t1.* FROM t_login_log t1
LEFT JOIN t_login_log t2 ON t1.user_id = t2.user_id AND t1.login_time < t2.login_time
WHERE t2.id IS NULL;
-
解释
对于有N条记录的用户来说,join之后的条数为(N-1) + (N-2) + ... + 0 + 1,对于左表来说,最小的一条有N-1条比它大,倒数第二条有N-2条比它大,以此类推,最大的一条没有谁比它大,但由于是左连接,会补上一条t2字段为NULL的一条,因此最后加上1。
WHERE也是为了取出最大的这条记录。 -
补上where之前的查询结果,方便理解
网友评论