我想从 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
我想使用 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