I have been working on this for a few weeks and I know there’s a way like using ROW_NUMBER(), but I’m just not too familiar with it, Or maybe there’s a better way….
x
Select *
from trans_rec
where tran_date <= '4-mar-2020' and tran_date >= '19-jun-2020'
shows this:
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
It needs to show this:
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
As you can see, there’s 2 delete dates for SKU
555454, and it has to show the lasted manual delete date of that SKU before a ship date of the same SKU.
Advertisement
Answer
Looks like you need something like this:
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
)
);
Full example with test data:
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
)
);
Result:
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