我想从 PLSQL 中的 table 删除带条件的重复项

I want to delete duplication with condition from a table in PLSQL

我想使用 PLSQL 删除重复行。 table的样本如下

Policy # Price Dealno for Loan # Price of Loan PersonID
123 10 Loan123 1,000 abc
123 10 Loan123 3,000 abc
456 10 Loan456 500 xyz
456 10 Loan456 500 null

如您所见,在策略 #123 的情况下,我尝试获取贷款价格最高的行。这意味着 3,000 的贷款价格。 对于策略 #456,我想获得没有空值的策略。

有没有办法让我在 PLSQL 中实现它。

谢谢

此查询根据您的定义确定某行是否 OK (rn = 1) 或是否为重复副本 (rn > 1)

select POLICY#, PRICE, LOAN#, PRICE_LOAN, PERSON_ID,
row_number() over (partition by POLICY# order by PRICE_LOAN desc, PERSON_ID nulls last) as rn
from tab
;


   POLICY#      PRICE LOAN#    PRICE_LOAN PER         RN
---------- ---------- -------- ---------- --- ----------
       123         10 loan123        3000 abc          1
       123         10 loan123        1000 abc          2
       456         10 loan4563        500 xyz          1
       456         10 loan4563        500              2

请注意,您在 唯一键 order by 上的 partition by 处使用了 row_number,这样您就可以首先获得应该被带走。

因此,要仅获取重复项,您可以使用此查询

with rn as (
select POLICY#, PRICE, LOAN#, PRICE_LOAN, PERSON_ID,
row_number() over (partition by POLICY# order by PRICE_LOAN desc, PERSON_ID nulls last) as rn
from tab
)
select * from rn where rn > 1;

   POLICY#      PRICE LOAN#    PRICE_LOAN PER         RN
---------- ---------- -------- ---------- --- ----------
       123         10 loan123        1000 abc          2
       456         10 loan4563        500              2

在此基础上你写了DELETE声明(如果你坚持PL/SQL,请附在BEGIN ... END

delete from tab where rowid in
(
with rn as (
select POLICY#, PRICE, LOAN#, PRICE_LOAN, PERSON_ID,
row_number() over (partition by POLICY# order by PRICE_LOAN desc, PERSON_ID nulls last) as rn
from tab
)
select rowid from rn where rn > 1
);

您可以检查删除是否正常....

select * from tab;

   POLICY#      PRICE LOAN#    PRICE_LOAN PER
---------- ---------- -------- ---------- ---
       123         10 loan123        3000 abc
       456         10 loan4563        500 xyz

... 和 commit