根据多列去除重复记录,保留具有特殊列值的行,去除其他行
有需求根据 航班天,航班号,出发三字码,到达三字码 去除重复记录,保留 时间最新的一条, 方式很多。。
下面是其中一种方式,学习了:
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;