oracle sql 按交易顺序对日期交易进行排序

时间:2021-06-16 00:31:50

标签: sql oracle

我已经为此研究了几个星期,我知道有一种方法类似于使用 ROW_NUMBER(),但我只是不太熟悉它,或者也许有更好的方法......

Select * 
from trans_rec 
where tran_date <= '4-mar-2020' and tran_date >= '19-jun-2020' 


显示:

Tran_date        SKU         type           tran_id
19-jun-2020      555123      arrive         GD001X60
18-jun-2020      555123      ship           GD001X60
18-jun-2020      555454      arrive         GD001X59
17-jun-2020      555454      ship           GD001X59
17-jun-2020      555123      Man-add        GD001X60
16-jun-2020      555123      Man-del        GD123457
16-jun-2020      555454      Man-add        GD001X59
15-jun-2020      555454      Man-del        GD123456
3-jun-2020       555454      Man-del        GD1230013
29-mar-2020      555123      sys-mer        GD123457
27-mar-2020      555123      sys-del        GD1230164
27-mar-2020      555123      sys-del        GD1230114
25-mar-2020      555454      sys-mer        GD123456
25-mar-2020      555123      bal
25-mar-2020      555123      sys-add        GD1230164
25-mar-2020      555123      arrive
24-mar-2020      555454      sys-del        GD1231011
24-mar-2020      555454      sys-del        GD1230012
24-mar-2020      555454      arrive
24-mar-2020      555454      sys-add        GD1231011
24-mar-2020      555454      sys-add        GD1230012
23-mar-2020      555123      Man-add        GD1230114
23-mar-2020      555454      Man-add        GD1230013
4-mar-2020       555454      bal
4-mar-2020       555123      bal
4-mar-2020       555454      bal

它需要显示:

SKU      SYS_MERGE_DT   latest_MAN_DEL_DT  MANUAL_ADD_DT        SHIP_DT        ARRIVE_DT        X_id
555123   29-mar-2020    16-jun-2020        17-jun-2020          18-jun-2020   19-jun-2020     GD001X60
555454   25-mar-2020    15-jun-2020        16-jun-2020          17-jun-2020   18-jun-2020     GD001X59

如您所见,SKU 555454 有 2 个删除日期,并且必须在同一 SKU 的发货日期之前显示该 SKU 的上次手动删除日期。

1 个答案:

答案 0 :(得分:1)

看起来你需要这样的东西:

select
  *
from (
    select
        ran_date,SKU,type
        ,max(tran_id)
            keep(dense_rank first order by ran_date desc)
                over(partition by SKU) as x_id
    from trans_rec
    )
pivot(
    max(ran_date) max_dt
    for type
    in (
        'arrive' as ARRIVE
        ,'sys-mer' as SYS_MERGE
        ,'ship' as SHIP
        ,'Man-del' as MANUAL_DEL
        ,'bal' as bal
    )
);

带有测试数据的完整示例:

with trans_rec(ran_date, SKU, type, tran_id) as (
    select to_date('19-jun-2020','dd-mon-yyyy'), 555123,'arrive' ,'GD001X60'  from dual union all
    select to_date('18-jun-2020','dd-mon-yyyy'), 555123,'ship'   ,'GD001X60'  from dual union all
    select to_date('18-jun-2020','dd-mon-yyyy'), 555454,'arrive' ,'GD001X59'  from dual union all
    select to_date('17-jun-2020','dd-mon-yyyy'), 555454,'ship'   ,'GD001X59'  from dual union all
    select to_date('17-jun-2020','dd-mon-yyyy'), 555123,'Man-add','GD001X60'  from dual union all
    select to_date('16-jun-2020','dd-mon-yyyy'), 555123,'Man-del','GD123457'  from dual union all
    select to_date('16-jun-2020','dd-mon-yyyy'), 555454,'Man-add','GD001X59'  from dual union all
    select to_date('15-jun-2020','dd-mon-yyyy'), 555454,'Man-del','GD123456'  from dual union all
    select to_date('03-jun-2020','dd-mon-yyyy'), 555454,'Man-del','GD1230013' from dual union all
    select to_date('29-mar-2020','dd-mon-yyyy'), 555123,'sys-mer','GD123457'  from dual union all
    select to_date('27-mar-2020','dd-mon-yyyy'), 555123,'sys-del','GD1230164' from dual union all
    select to_date('27-mar-2020','dd-mon-yyyy'), 555123,'sys-del','GD1230114' from dual union all
    select to_date('25-mar-2020','dd-mon-yyyy'), 555454,'sys-mer','GD123456'  from dual union all
    select to_date('25-mar-2020','dd-mon-yyyy'), 555123,'bal'    ,null        from dual union all
    select to_date('25-mar-2020','dd-mon-yyyy'), 555123,'sys-add','GD1230164' from dual union all
    select to_date('25-mar-2020','dd-mon-yyyy'), 555123,'arrive' ,null        from dual union all
    select to_date('24-mar-2020','dd-mon-yyyy'), 555454,'sys-del','GD1231011' from dual union all
    select to_date('24-mar-2020','dd-mon-yyyy'), 555454,'sys-del','GD1230012' from dual union all
    select to_date('24-mar-2020','dd-mon-yyyy'), 555454,'arrive' ,null        from dual union all
    select to_date('24-mar-2020','dd-mon-yyyy'), 555454,'sys-add','GD1231011' from dual union all
    select to_date('24-mar-2020','dd-mon-yyyy'), 555454,'sys-add','GD1230012' from dual union all
    select to_date('23-mar-2020','dd-mon-yyyy'), 555123,'Man-add','GD1230114' from dual union all
    select to_date('23-mar-2020','dd-mon-yyyy'), 555454,'Man-add','GD1230013' from dual union all
    select to_date('04-mar-2020','dd-mon-yyyy'), 555454,'bal'    ,null        from dual union all
    select to_date('04-mar-2020','dd-mon-yyyy'), 555123,'bal'    ,null        from dual union all
    select to_date('04-mar-2020','dd-mon-yyyy'), 555454,'bal'    ,null        from dual
)
select
  *
from (
    select
        ran_date,SKU,type
        ,max(tran_id)
            keep(dense_rank first order by ran_date desc)
                over(partition by SKU) as x_id
    from trans_rec
    )
pivot(
    max(ran_date) max_dt
    for type
    in (
        'arrive' as ARRIVE
        ,'sys-mer' as SYS_MERGE
        ,'ship' as SHIP
        ,'Man-del' as MANUAL_DEL
        ,'bal' as bal
    )
);

结果:


       SKU X_ID      ARRIVE_MAX_DT       SYS_MERGE_MAX_DT    SHIP_MAX_DT         MANUAL_DEL_MAX_DT   BAL_MAX_DT
---------- --------- ------------------- ------------------- ------------------- ------------------- -------------------
    555454 GD001X59  2020-06-18 00:00:00 2020-03-25 00:00:00 2020-06-17 00:00:00 2020-06-15 00:00:00 2020-03-04 00:00:00
    555123 GD001X60  2020-06-19 00:00:00 2020-03-29 00:00:00 2020-06-18 00:00:00 2020-06-16 00:00:00 2020-03-25 00:00:00

相关问题