Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除oracle sql中列值的重复项并获取最后一次出现的值_Sql_Oracle_Duplicates - Fatal编程技术网

删除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
vs
H_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上的最大值