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