Sql Oracle如何基于多个数据库列和条件删除重复项
我有一个很大的表格,里面有从多个系统收集的数据。我现在必须根据条件和多列删除重复记录 以下是一个例子:Sql Oracle如何基于多个数据库列和条件删除重复项,sql,oracle,Sql,Oracle,我有一个很大的表格,里面有从多个系统收集的数据。我现在必须根据条件和多列删除重复记录 以下是一个例子: +---------------+-------------+------+-----+-------- | System ID | Debt Num | Exp Dt | Account NO | +---------------+-------------+------+-----+--------- | pay | 2222 | 0114
+---------------+-------------+------+-----+--------
| System ID | Debt Num | Exp Dt | Account NO |
+---------------+-------------+------+-----+---------
| pay | 2222 | 0114 | 111 |
| pay | 2222 | 0214 | 111 |
| Online | 2222 | 0214 | 111 |
| Online | 3333 | 0115 | 222 |
| Online | 3333 | 0116 | 222 |
| ERP | 2222 | 0214 | 111 |
| ERP | 4444 | 0114 | 333 |
+---------------+-------------+------+-----+--------
从上述数据中,删除满足以下条件的重复项
删除按借方编号、exp dt、账号分组的重复行,并使用maxexp dt保留一条记录。
保留的记录优先于系统ID。1在线支付2和3 ERP。在上述账户111中,我们有所有三个系统的记录,借记卡的maxexp dt是所有三个系统的0214。仅应保留exp dt=0214的Pay记录,其余记录应删除。
正如上面关于账户222的例子,我们没有pay的记录,因此优先考虑在线系统和ERP,其中应保留maxexp dt。
我尝试过网上的多个查询,比如group by、row_number,但都只满足一个条件
感谢您的帮助,提出您的想法和建议
编辑:
Gordon的查询工作正常,符合我的要求,但是当我在包含540K行的登台上运行相同的查询时,它会出错ORA-00600内部错误。我认为您可以使用rowid和相关子查询执行此操作:
delete from payinfo_staging_db
where rowid <> (select rowid
from (select rowid
from payinfo_staging_db t2
where t2.debitNum = payinfo_staging_db.debitNum and
t2.accountNo = payinfo_staging_db.accountNo
order by t2.exp_dt,
(case when t2.SystemId = 'Pay' then 1
when t2.SystemId = 'Online' then 2
when t2.SystemId = 'ERP' then 3
end)
) r
where rownum = 1
);
编辑:
Oracle中的嵌套引用一定有问题。以下内容至少在正确解析和执行的意义上起作用:
delete from payinfo_staging_db
where rowid <> (select min(rowid) keep (dense_rank first order by exp_dt desc,
(case when t2.SystemId = 'Pay' then 1
when t2.SystemId = 'Online' then 2
when t2.SystemId = 'ERP' then 3
end)
) as therowid
from payinfo_staging_db t2
where t2.debitNum = payinfo_staging_db.debitNum and
t2.accountNo = payinfo_staging_db.accountNo
);
SQL FIDLE是。您研究过Oracle合并命令吗?@scraatz直到现在都没有。我刚刚看了一个例子`匹配时合并到。。当不匹配时。这是正确的吗?你有更好的参考资料吗?顺便说一句,好主意,好建议。我会试试的。对不起,我只是最近在解决类似问题时才发现的。我在Google上搜索了oracle从联接中删除,就像在其他数据库上一样,您可以从联接表中删除,这在oracle上是不可能的。我尝试了上述操作,并注意到错误t.debitNum:标识无效。表别名t在子查询中有效吗?表的名称是什么?我的表名是payinfo_staging_db,我将t替换为payinfo_staging_db t,与t t2中的payinfo_staging_db t2相同。希望这是正确的。我现在看到编辑,我已经试过了。相同错误ORA-00904.payinfo\u staging\u db:debitNum无效标识符。@dicaprio。这将选择一行,第一行基于order by。日期的第一个子句获取最近的日期。然后由系统根据您的偏好进行订购。