在对数据进行GROUP BY聚合操作时,有时会保留其中一条数据的部分数据。比如现在有一张用户信息表(user):
ID(id) | 用户编号(user_id) | 用户名称(user_name) | 修改时间(modify_time) | 用户状态(status) |
---|---|---|---|---|
1 | 10000 | 张三 | 2019-10-11 | 1 |
2 | 10000 | 张三 | 2019-12-12 | 1 |
3 | 10000 | 张三 | 2020-5-22 | 1 |
4 | 10001 | 李四 | 2019-8-8 | 1 |
5 | 10001 | 李四 | 2019-11-21 | 1 |
对用户信息进行更新时,都会重新新增一条记录。每个用户信息都有多条数据,而最后更新的一条为最新的数据。
在查询用户列表时,我们会对用户编号进行聚合GROUP BY,并选取最新的一条的部分数据最为查询结果。
先查询每个用户的最大ID集合,然后再通过IN 查询用户详情信息。
select *
from user
where id in (
select max(id)
from user
group by user_id
)
这种方案只能查询 最大和最小 的数据。
在每个聚合集合中添加一个编号字段。
select *
from (
select *, row_number() OVER (PARTITION by user_id order by modify_time desc) as rownum
from user
) t
where rownum = 1
内容来源于网络,如有侵权,请联系作者删除!