Reputation: 3869
I have below query which is generating duplicate result for H_POSAL_ID
as H_POSAL_ID
can change H_KACCT_ID
in time:
SELECT
'XXX',
'JP',
ACC.H_KACCT_BK,
LACC.H_KACCT_ID,
HSAL.H_POSAL_BK,
LACC.H_POSAL_ID
FROM DRD_ORD LACC
INNER JOIN TRC_ORD ACC
ON LACC.H_KACCT_ID =ACC.H_KACCT_ID
AND LACC.SYS_DB_NAME =ACC.SYS_DB_NAME
AND ACC.SYS_DB_NAME ='JP'
INNER JOIN H_SALES HSAL
ON LACC.H_POSAL_ID = HSAL.H_POSAL_ID
AND LACC.SYS_DB_NAME = HSAL.SYS_DB_NAME
AND HSAL.SYS_DB_NAME ='JP'
WHERE LACC.SYS_DB_NAME ='JP'
and LACC.H_POSAL_ID = 302774;
Result:
I want to take only the last occurence of H_POSAL_ID
vs H_KACCT_ID
Upvotes: 1
Views: 115
Reputation: 14858
You could number rows in proper order using row_number()
and take only first rows for each h_posal_id
, like here:
select h_kacct_bk, h_kacct_id, h_posal_bk, h_posal_id
from (select h_kacct_bk, h_kacct_id, h_posal_bk, h_posal_id,
row_number() over (partition by h_posal_id order by h_kacct_id desc) rn
from t)
where rn = 1
You can also use max() keep dense rank...
or last_value()
or find max values of h_kacct_id
for each h_posal_id
in subquery. But row_number()
seems to be more compact and readable.
Upvotes: 1
Reputation: 1109
Try below SQL , it contains additional condition in where clause which gives max H_KACCT_ID for each H_POSTAL_ID. There can be other way to write this by using a sub query instead of using additional condition in where.
SELECT
'XXX',
'JP',
ACC.H_KACCT_BK,
LACC.H_KACCT_ID,
HSAL.H_POSAL_BK,
LACC.H_POSAL_ID
FROM DRD_ORD LACC
INNER JOIN TRC_ORD ACC
ON LACC.H_KACCT_ID =ACC.H_KACCT_ID
AND LACC.SYS_DB_NAME =ACC.SYS_DB_NAME
AND ACC.SYS_DB_NAME ='JP'
INNER JOIN H_SALES HSAL
ON LACC.H_POSAL_ID = HSAL.H_POSAL_ID
AND LACC.SYS_DB_NAME = HSAL.SYS_DB_NAME
AND HSAL.SYS_DB_NAME ='JP'
WHERE LACC.SYS_DB_NAME ='JP'
and (LACC.H_POSAL_ID, LACC.H_KACCT_ID) IN (SELECT H_POSAL_ID, MAX(H_KACCT_ID) H_KACCT_ID from DRD_ORD group by H_POSAL_ID)
and LACC.H_POSAL_ID = 302774;
Upvotes: 1