根据多列去除重复记录,保留具有特殊列值的行,去除其他行

有需求根据 航班天,航班号,出发三字码,到达三字码 去除重复记录,保留 时间最新的一条, 方式很多。。

下面是其中一种方式,学习了:

row_number() over( partition col1 order by col2 )  , 解释: 根据col1 分组,在分组内使用col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内是连续且唯一的)

就相当于对每个分组内的 记录排序,得出该记录在分组内的顺序,

select 

m.content content,d.carrier_cd||d.flt_nbr flightNo,d.flt_dt flightDate,d.orig_airport_cd orig,d.dest_airport_cd dest,
m.message_time
,ROW_NUMBER() OVER(PARTITION BY d.carrier_cd||d.flt_nbr,d.flt_dt,d.orig_airport_cd,d.dest_airport_cd ORDER BY m.message_time DESC) rn

from flight_dynamics d left join flight_messages m
on m.flight_no=d.carrier_cd||d.flt_nbr and m.flight_date = d.flt_dt and m.ORIG_AIRPORT_CD=d.ORIG_AIRPORT_CD
and m.DEST_AIRPORT_CD = d.DEST_AIRPORT_CD where to_char(d.flt_dt,'yyyy-mm-dd')='2016-10-31' and m.flight_no='MU566'
order by m.message_time desc。

可以看到按照 FLIGHTNO,FLIGHTDATE,ORIG,DEST四列分组,按照时间排序,得到了这两列的 ROW_NUMBER() 值。。显然第一行符合我们的条件

接下来对该视图 where 筛选即可

select * from (

select 

m.content content,d.carrier_cd||d.flt_nbr flightNo,d.flt_dt flightDate,d.orig_airport_cd orig,d.dest_airport_cd dest,
m.message_time
,ROW_NUMBER() OVER(PARTITION BY d.carrier_cd||d.flt_nbr,d.flt_dt,d.orig_airport_cd,d.dest_airport_cd ORDER BY m.message_time DESC) rn

from flight_dynamics d left join flight_messages m 
on m.flight_no=d.carrier_cd||d.flt_nbr and m.flight_date = d.flt_dt and m.ORIG_AIRPORT_CD=d.ORIG_AIRPORT_CD 
and m.DEST_AIRPORT_CD = d.DEST_AIRPORT_CD where to_char(d.flt_dt,'yyyy-mm-dd')='2016-10-31' and m.flight_no='MU566' 
order by m.message_time desc) t  where rn=1;

原文地址:https://www.cnblogs.com/zhangchenglzhao/p/6019522.html