删除oracle sql中列值的重复项并获取最后一次出现的值
我有以下查询,它正在为删除oracle sql中列值的重复项并获取最后一次出现的值,sql,oracle,duplicates,Sql,Oracle,Duplicates,我有以下查询,它正在为H_POSAL_ID生成重复结果,因为H_POSAL_ID可以及时更改H_KACCT_ID: 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_
H_POSAL_ID
生成重复结果,因为H_POSAL_ID
可以及时更改H_KACCT_ID
:
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;
结果:
我只想取最后一个出现的
H_POSAL_ID
vsH_KACCT_ID
试试下面的SQL,它在where子句中包含附加条件,该子句为每个H_POSAL_ID提供了最大H_KACCT_ID。可以通过使用子查询而不是在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;
您可以使用
row\u number()
按正确的顺序对行进行编号,并为每个h\u posal\u id
只取第一行,如下所示:
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
您还可以在子查询中使用
max()keep density rank…
或last\u value()
或查找每个h\u posal\u id
的最大值。但是行号()
似乎更简洁易读。是否有单独的时间戳或日期列来获取上次出现的h_posal_id?实际上,我不想获取时间戳或日期列,但希望获取最后出现的h_posal_id意味着我相信我必须对相同的记录使用MAX函数?结果中的两条记录中,您选择了哪一条你在找什么?哪列上的最大值?H_POSAL_ID上的最大值