某字段重复,按时间取出最近的一条数据

基于Oracle:

数据表如下:

期望得到的结果:

 

建表:

create table AA_WW
(
  id              NUMBER(10),
  name            VARCHAR2(10),
  creater         VARCHAR2(30),
  creater_time    DATE not null,

);
insert into AA_WW (id, name, creater, creater_time)
values ('1', 'name1','ww', to_date('13-11-2017 09:47:56', 'dd-mm-yyyy hh24:mi:ss'));
insert into AA_WW (id, name, creater, creater_time)
values ('2', 'name2','ww', to_date('28-11-2017 09:47:56', 'dd-mm-yyyy hh24:mi:ss'));
insert into AA_WW (id, name, creater, creater_time)
values ('3', 'name3','ee', to_date('24-11-2017 09:47:56', 'dd-mm-yyyy hh24:mi:ss'));
insert into AA_WW (id, name, creater, creater_time)
values ('4', 'name4','ee', to_date('25-11-2017 09:47:56', 'dd-mm-yyyy hh24:mi:ss'));
insert into AA_WW (id, name, creater, creater_time)
values ('5', 'name5','ww', to_date('29-11-2017 09:47:56', 'dd-mm-yyyy hh24:mi:ss'));

 方案一:

select a.* from AA_WW a
 inner join 
  (
      select b.creater, max(b.creater_time) time
      from AA_WW b
      group by b.creater
  ) c
  on a.creater = c.creater
  and a.creater_time = c.time

方案二:(仅限于Oracle)

select temp.*
from (
         select
             t.id,
             t.name,
             t.creater,
             t.creater_time,
             row_number() OVER(PARTITION BY t.creater ORDER BY t.creater_time desc) as row_flg   
          from AA_WW t 
      ) temp
where temp.row_flg  = '1'

方案三:

select * from AA_WW a 
where not exists (
      select * from AA_WW b
      where a.creater = b.creater
      and a.creater_time < b.creater_time
)

 

posted @ 2019-04-18 17:20  隔壁w王叔叔  阅读(332)  评论(0)    收藏  举报