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

 更新时间:2024年04月26日 10:08:49   作者:涛哥是个大帅比  
这篇文章主要介绍了Sql group by 分组取时间最新的一条数据,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

项目场景:

数据库: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 分组取数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql创建表添加字段注释的实现方法

    mysql创建表添加字段注释的实现方法

    这篇文章主要介绍了mysql创建表添加字段注释的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • MySQL select、insert、update批量操作语句代码实例

    MySQL select、insert、update批量操作语句代码实例

    这篇文章主要介绍了MySQL select、insert、update批量操作语句代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • mysql8.0.21下载安装详细教程

    mysql8.0.21下载安装详细教程

    这篇文章主要介绍了mysql8.0.21下载安装详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 跟着hsp一步步学mysql优化的方法

    跟着hsp一步步学mysql优化的方法

    本篇文章小编为大家介绍,跟着hsp一步步学mysql优化的方法。需要的朋友参考下
    2013-04-04
  • mysqldump加-w参数备份数据时需要注意的事项

    mysqldump加-w参数备份数据时需要注意的事项

    这篇文章主要介绍了mysqldump加-w参数备份数据时需要注意的事项,需要的朋友可以参考下
    2014-06-06
  • Dbeaver连接不上mysql数据库(Access denied for user ‘root‘@‘localhost‘)

    Dbeaver连接不上mysql数据库(Access denied for user&nb

    本文主要介绍了Dbeaver连接不上mysql数据库(Access denied for user ‘root‘@‘localhost‘),尝试了很多方法,下面就来介绍一下,感兴趣的可以了解一下
    2024-04-04
  • MySQL在关联复杂情况下所能做出的一些优化

    MySQL在关联复杂情况下所能做出的一些优化

    这篇文章主要介绍了MySQL在关联复杂情况下所能做出的一些优化,作者通过添加索引来不断优化查询时间,需要的朋友可以参考下
    2015-05-05
  • MySQL中REPLACE INTO和INSERT INTO的区别分析

    MySQL中REPLACE INTO和INSERT INTO的区别分析

    REPLACE的运行与INSERT很相似。只有一点例外,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。
    2011-07-07
  • InnoDB引擎中的事务详解

    InnoDB引擎中的事务详解

    这篇文章主要介绍了InnoDB引擎中的事务详解,事务Transaction是访问和更新数据库的程序执行单元;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行,需要的朋友可以参考下
    2023-09-09
  • MySQL如何快速批量插入1000w条数据

    MySQL如何快速批量插入1000w条数据

    这篇文章主要给大家介绍了关于MySQL如何快速批量插入1000w条数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论