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

有时在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;

 

posted @ 2013-12-03 16:22  eva_1103ah  阅读(1118)  评论(0编辑  收藏  举报