I am looking to display the group which is grouped on id column where trans_cd='Audit'
only on max trans_proc_dt of that group. There should not be any other trans_cd='Audit'
execpt for max trans_proc_dt.
x
ID TRANS_PROC_DT TRANS_CD TRANS_AMT
165 5/13/2020 Renewal 553
165 10/22/2020 Cancellation -376
165 11/24/2020 Audit 3
165 6/2/2021 Change 0
165 6/2/2021 Audit -7
165 6/3/2021 Audit 0
497 5/1/2020 Renewal 1394
497 1/11/2021 Cancellation -578
497 2/10/2021 Audit -3
497 4/28/2021 Audit 76
497 5/12/2021 Audit -73
497 6/2/2021 Change 0
511 4/27/2020 Renewal 4409
511 7/30/2020 Change 0
511 10/5/2020 Cancellation -2558
511 2/18/2021 Audit 2806
577 5/15/2020 Renewal 829
577 2/12/2021 Audit -123
577 4/28/2021 Audit 118
577 5/12/2021 Audit 5
577 6/2/2021 Change 0
577 6/2/2021 Audit -5
577 6/3/2021 Audit 0
577 12/4/2020 Renewal 1996
577 6/2/2021 Change 0
751 5/13/2020 Renewal 1307
751 1/28/2021 Cancellation -523
751 3/3/2021 Audit 481
751 4/28/2021 Audit 120
751 5/12/2021 Audit -601
751 6/2/2021 Change 0
751 6/2/2021 Audit 601
751 6/3/2021 Audit 0
984 5/13/2020 Renewal 1081
984 11/2/2020 Change 0
984 6/3/2021 Audit 0
My output should be
ID TRANS_PROC_DT TRANS_CD TRANS_AMT
511 4/27/2020 Renewal 4409
511 7/30/2020 Change 0
511 10/5/2020 Cancellation -2558
511 1/27/2021 Renewal 4409
511 2/18/2021 Audit 2806
984 5/13/2020 Renewal 1081
984 11/2/2020 Change 0
984 6/3/2021 Audit 0
I can’t think how to go about getting my result set.
Advertisement
Answer
You can use analytic functions to calculate absolute maximum date and minimum date of Audit
code per group, then compare them: if no more such transactions occurred on other dates, they should be equal.
with a(ID, TRANS_PROC_DT, TRANS_CD, TRANS_AMT) as (
select 165, '5/13/2020', 'Renewal', 553 from dual union all
select 165, '10/22/2020', 'Cancellation', -376 from dual union all
select 165, '11/24/2020', 'Audit', 3 from dual union all
select 165, '6/2/2021', 'Change', 0 from dual union all
select 165, '6/2/2021', 'Audit', -7 from dual union all
select 165, '6/3/2021', 'Audit', 0 from dual union all
select 497, '5/1/2020', 'Renewal', 1394 from dual union all
select 497, '1/11/2021', 'Cancellation', -578 from dual union all
select 497, '2/10/2021', 'Audit', -3 from dual union all
select 497, '4/28/2021', 'Audit', 76 from dual union all
select 497, '5/12/2021', 'Audit', -73 from dual union all
select 497, '6/2/2021', 'Change', 0 from dual union all
select 511, '4/27/2020', 'Renewal', 4409 from dual union all
select 511, '7/30/2020', 'Change', 0 from dual union all
select 511, '10/5/2020', 'Cancellation', -2558 from dual union all
select 511, '2/18/2021', 'Audit', 2806 from dual union all
select 577, '5/15/2020', 'Renewal', 829 from dual union all
select 577, '2/12/2021', 'Audit', -123 from dual union all
select 577, '4/28/2021', 'Audit', 118 from dual union all
select 577, '5/12/2021', 'Audit', 5 from dual union all
select 577, '6/2/2021', 'Change', 0 from dual union all
select 577, '6/2/2021', 'Audit', -5 from dual union all
select 577, '6/3/2021', 'Audit', 0 from dual union all
select 577, '12/4/2020', 'Renewal', 1996 from dual union all
select 577, '6/2/2021', 'Change', 0 from dual union all
select 751, '5/13/2020', 'Renewal', 1307 from dual union all
select 751, '1/28/2021', 'Cancellation', -523 from dual union all
select 751, '3/3/2021', 'Audit', 481 from dual union all
select 751, '4/28/2021', 'Audit', 120 from dual union all
select 751, '5/12/2021', 'Audit', -601 from dual union all
select 751, '6/2/2021', 'Change', 0 from dual union all
select 751, '6/2/2021', 'Audit', 601 from dual union all
select 751, '6/3/2021', 'Audit', 0 from dual union all
select 984, '5/13/2020', 'Renewal', 1081 from dual union all
select 984, '11/2/2020', 'Change', 0 from dual union all
select 984, '6/3/2021', 'Audit', 0 from dual
)
, last_dt as (
select
a.*
, min(
case trans_cd
when 'Audit'
then to_date(TRANS_PROC_DT, 'mm/dd/yyyy')
end
) over(partition by id)
as audit_dt
, max(to_date(TRANS_PROC_DT, 'mm/dd/yyyy'))
over(partition by id)
as max_dt
from a
)
select
id
, trans_proc_dt
, trans_cd
, trans_amt
from last_dt
where max_dt = audit_dt
order by id, to_date(TRANS_PROC_DT, 'mm/dd/yyyy')
ID | TRANS_PROC_DT | TRANS_CD | TRANS_AMT --: | :------------ | :----------- | --------: 511 | 4/27/2020 | Renewal | 4409 511 | 7/30/2020 | Change | 0 511 | 10/5/2020 | Cancellation | -2558 511 | 2/18/2021 | Audit | 2806 984 | 5/13/2020 | Renewal | 1081 984 | 11/2/2020 | Change | 0 984 | 6/3/2021 | Audit | 0
db<>fiddle here