当前位置:   article > 正文

Sql group by 分组取时间最新的一条数据_group by取最新的一条值

group by取最新的一条值

项目场景:

数据库:Oracle

表名:Test

字段名:Id、PId、Name、Time

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


示例代码: 

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

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

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

  1. select *
  2. from test t
  3. where
  4. pid
  5. in
  6. (
  7. select PId from Test t
  8. where
  9. time=(select max(time) from Test t1 where t1.PId=t.PId)
  10. group by Pid
  11. )
  12. and
  13. time=(select max(time) from Test t1 where t1.PId=t.PId)

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

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

  1. /*注意Id必须使用聚合函数Max*/
  2. SELECT max(Id), Pid, MAX(Time) as MaxTime
  3. FROM Test
  4. GROUP BY Pid

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

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

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

  1. /*降序是为了where KeyId=1 (1是固定值第一条),如果升序由于不知道每组多少条where中KeyId就无法过滤了*/
  2. select *
  3. from (
  4. select row_number() over(partition by Pid order by Time desc) as KeyId ,* from Test
  5. ) d
  6. where KeyId=1


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

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

  1. SELECT *
  2. FROM (
  3. SELECT *,
  4. MIN(Time) OVER (PARTITION BY Pid) AS min_time
  5. FROM Test
  6. ) t
  7. WHERE Time = min_time;

 原文:https://www.cnblogs.com/xuejianxiyang/p/11980908.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/952795
推荐阅读
相关标签
  

闽ICP备14008679号