zoukankan      html  css  js  c++  java
  • 根据多列去除重复记录,保留具有特殊列值的行,去除其他行

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

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

    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;

  • 相关阅读:
    联赛模拟测试19
    联考Day5
    联赛模拟测试18(A.施工未补)
    题解 CF960G 【Bandit Blues】
    题解 P5518 【[MtOI2019]幽灵乐团 / 莫比乌斯反演基础练习题】
    概率与数学期望笔记
    题解 P3704 【[SDOI2017]数字表格】
    主定理
    【题解】Hikari与组合数
    【题解】P2303 [SDOI2012] Longge 的问题
  • 原文地址:https://www.cnblogs.com/zhangchenglzhao/p/6019522.html
Copyright © 2011-2022 走看看