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;

  • 相关阅读:
    一,安装python
    maven搭建ssm
    web优化
    java代码优化29个点
    供参考的 php 学习路线
    javascript-文档结构遍历
    jquery中的cookie使用
    jQuery中的Ajax
    lambda和抽象类
    上传jar包到nexus私服
  • 原文地址:https://www.cnblogs.com/zhangchenglzhao/p/6019522.html
Copyright © 2011-2022 走看看