保留由C升到B再升到A的过程,但是若是由A变到C或者B,只保留A

select  userid,level, time,
        first_value(time) OVER(PARTITION BY userid,level ORDER BY time) as firstTime,
        last_value(time) OVER(PARTITION BY userid,level ORDER BY time) as lastTime
         

from
(
select  userid,time,level,level_1_next,rn_asc,rn_desc,rn_1_time,level_1_next_1_last
        ,case when level_1_next_1_last<level then 1 else null end as drop
from
(
select  userid,time,level,level_1_next,rn_asc,rn_desc,rn_1_time
        ,LAG(level_1_next,1,level) OVER(PARTITION BY userid,level ORDER BY time) AS level_1_next_1_last
        
from
--rn_asc往下取一个
(select  userid,time,level,level_1_next,rn_asc,rn_desc
         ,LEAD(rn_asc) OVER(PARTITION BY userid ORDER BY time) AS rn_1_time
         
from
    (--level往下取一个,按照userid和level分组按时间正序和倒序排序
    select userid,time,level,
        LEAD(level) OVER(PARTITION BY userid ORDER BY time) AS level_1_next,
        row_number() OVER(PARTITION BY userid,level ORDER BY time) AS rn_asc,
        row_number() OVER(PARTITION BY userid,level ORDER BY time desc) AS rn_desc
    from lst_lag_test
    )a0
)a1
where  (rn_asc=1) or (level>level_1_next and level_1_next in ("A","B","C") and rn_1_time=1) or (rn_desc=1)
)b
)c
where drop is null
group by userid,level,time

表lst_lag_test内容如下:

useridtimelevel
Mary20180701C
Mary20180702 
Mary20180703C
Mary20180704B
Mary20180705C
Mary20180706B
Mary20180707B
Mary20180708B
Mary20180709A
Mary20180710A
Mary20180711B
Mary20180712A
Mary20180713A
Mary20180718C
Mary20180805A
Mary20180806A
Mary20180807B
Mary20180808A
Mary20180809A
Mary20180810B
Mary20180811B
Mary20180812B
Mary20180813C
Mary20180814B
Mary20180815C
Mary20180816 
Mary20180817C
Mary20180818C
Peter20180801C
Peter20180803C
Peter20180805 
Peter20180807C
Peter20180809B
Peter20180810C
Peter20180811B
Peter20180812B
Peter20180813B
Peter20180814A
Peter20180815A
Peter20180816B
Peter20180817A
Peter20180818A
Tom20180701A
Tom20180702 
Tom20180703C
Tom20180704B
Tom20180705C
Tom20180706B
Tom20180707B
Tom20180708B
Tom20180709B
Tom20180710C
Tom20180711B
Tom20180712C
Tom20180713C
Tom20180718C

 

最上面的代码跑完后的结果:

useridleveltimefirsttimelasttime
Mary 201807022018070220180702
Mary 201808162018070220180816
MaryA201807092018070920180709
MaryA201808092018070920180809
MaryB201807042018070420180704
MaryB201807082018070420180708
MaryC201807012018070120180701
Peter 201808052018080520180805
PeterA201808142018081420180814
PeterA201808182018081420180818
PeterB201808092018080920180809
PeterB201808132018080920180813
PeterC201808012018080120180801
PeterC201808072018080120180807
Tom 201807022018070220180702
TomA201807012018070120180701
TomB201807042018070420180704
TomB201807112018070420180711
TomC201807032018070320180703
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值