当前位置: 代码网 > it编程>数据库>Mysql > Sql group by 分组取时间最新的一条数据(示例代码)

Sql group by 分组取时间最新的一条数据(示例代码)

2024年05月26日 Mysql 我要评论
项目场景:数据库:oracle表名:test字段名:id、pid、name、time需求:根据pid分组,1、取时间最新的一条数据;2、取时间最早的一条数据。示例代码:一、取时间最新的一条数据1.取时

项目场景:

数据库:oracle

表名:test

字段名:id、pid、name、time

需求:根据pid分组,1、取时间最新的一条数据;2、取时间最早的一条数据。

示例代码: 

一、取时间最新的一条数据

1.取时间最新的记录分组,允许重复

多条time一样的都是最新记录

select *
from test t
where
pid 
in
(
    select pid from test t
    where
    time=(select max(time) from test t1 where t1.pid=t.pid)
    group by pid
)
and
time=(select max(time) from test t1 where t1.pid=t.pid)

2.分组后取时间最新的记录,不允许重复

如果id是序列自增长可以使用max(id),多条time一样的只取一条

/*注意id必须使用聚合函数max*/
select max(id), pid, max(time) as maxtime
from test
group by pid

3.使用row_number()窗口函数,不允许重复

如果id是uuid类型无法使用max(id)的解决办法,使用row_number()窗口函数

在这个查询中,我们使用了row_number()窗口函数,并按照pid进行分组。然后,我们按照time降序排序,以便最新的时间排在前面。最后,在外部查询中,我们选择排名为1的记录,即每个分组中时间最新的记录。

/*降序是为了where keyid=1 (1是固定值第一条),如果升序由于不知道每组多少条where中keyid就无法过滤了*/
select *
from (
  select row_number() over(partition by pid order by time desc) as keyid ,* from test   
) d
where keyid=1

二、取时间最早的一条数据

 这个查询使用了窗口函数min来获取每个分组中的最小时间值(min_time)。然后,在外部查询中,通过比较time和min_time来过滤出每个分组中时间最早的数据行。

select *
from (
  select *,
         min(time) over (partition by pid) as min_time
  from test
) t
where time = min_time; 

到此这篇关于sql group by 分组取时间最新的一条数据的文章就介绍到这了,更多相关sql group by 分组取数据内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com