表中数据按时间取最新的一条记录

有时在oracle中可能会需要这样的处理,比如展厅日志,记录了如下信息:姓名、登记时间,因一天内可能存在同一个人多次登记的情况(这里为了简单没有考虑重名的问题),所以需要最新的一次登记记录,这就要用到去重处理,先建表并添加数据:

create table test (name varchar2(200),loc varchar2(200), last_update varchar2(200));
insert into test_a(name,loc,last_UPdate) values('栾鹰','1','2012-8-5 18:30:39');
insert into test_a(name,loc,last_UPdate) values('栾鹰','2','2012-8-7 18:30:39');
insert into test_a(name,loc,last_UPdate) values('吴森','3','2012-8-6 18:30:39');
insert into test_a(name,loc,last_UPdate) values('栾鹰','4','2012-8-6 18:30:39');
insert into test_a(name,loc,last_UPdate) values('吴森','5','2012-7-27 14:47:58');
insert into test_a(name,loc,last_UPdate) values('蔡德贤','6','2012-7-27 14:47:58');
commit;
--1.先按name分组,查出每个人的最新记录,因为group by中没有id,因此,再通过查出来的两个字段做连接,弊端是当字段多的话,需要用更多的连接
SELECT *
  FROM TEST_A A,
       (SELECT NAME, MAX(LAST_UPDATE) LAST_UPDATE FROM TEST_A GROUP BY NAME) C
 WHERE A.NAME = C.NAME
   AND A.LAST_UPDATE = C.LAST_UPDATE;
   
--2.将表看做两个,查出相同name的记录,一个表的更新时间都大于另外一个表的更新时间,这样就可以取到相同name下的最新记录   
select *
  from TEST_A t
 where not exists (select 1
          from TEST_A
         where NAME = t.NAME
           and LAST_UPDATE > t.LAST_UPDATE);

--3.使用分析函数           
select  name, LAST_UPDATE, LOC
  from (select LOC,
               name,
               LAST_UPDATE,
               row_number() over(partition by name order by LAST_UPDATE desc) rn
          from TEST_A)
 where rn = 1;

 

转载于:https://www.cnblogs.com/eva-wu/p/3455994.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值