Sql group by 分组取时间最新的一条数据
数据库:Oracle表名:Test字段名:Id、PId、Name、Time需求:根据PId分组,1、取时间最新的一条数据;2、取时间最早的一条数据。
文章共574字 · 阅读需要大约2分钟
一键AI生成摘要,助你高效阅读
问答
·
项目场景:
数据库: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;
更多推荐
已为社区贡献7条内容
所有评论(0)