根据不同列中的值删除重复项
Posted
技术标签:
【中文标题】根据不同列中的值删除重复项【英文标题】:Remove duplicates based on a value from a different column 【发布时间】:2021-01-10 23:57:55 【问题描述】:在 MS Visual Studio 中,我有下表 1,我想根据 PrimIndicator 列删除重复的 caseNum。如果案例编号有重复的caseNum,我想保留带有“True” PrimIndicator 的行,如果caseNum 不重复,则保留CaseNum。
表1:
ID CaseNum PrimIndicator
1 AAA-123 TRUE
2 AAA-123 FALSE
3 BBB-546
4 CCC-753 TRUE
5 CCC-753
6 ABC-347
7 DEF-546 TRUE
8 DEF-346
想要表2:
ID CaseNum PrimIndicator
1 AAA-123 TRUE
3 BBB-546
4 CCC-753 TRUE
6 ABC-347
7 DEF-546 TRUE
到目前为止,我已经尝试过了,但如果 PrimIndicator 为空白,max() 函数似乎不起作用。
Select ID, distinct CaseNum, Max(PrimIndicator)
from Table1
group by CaseNum, PrimIndicator
【问题讨论】:
【参考方案1】:如果您只希望每个casenum
有一行,我建议row_number()
:
select t.*
from (select t.*,
row_number() over (partition by casenum
order by case when primeindicator = 'true' then 1 else 2 end
) as seqnum
from t
) t
where seqnum = 1;
这保证结果集中每个casenum
一行。
根据您的数据,您还可以使用where
逻辑:
select t.*
from t
where t.primeindicator = 'true' or
not exists (select 1
from t t2
where t2.casenum = t.casenum and
t2.primeindicator = 'true'
);
这并不能保证每个casenum
有一行——但它确实适用于您提供的数据。
【讨论】:
@Sprt_Add 。 . .我回答了这个问题,因为 GMB 的答案不能保证每个casenum
准确返回一行。特别是,它会过滤掉具有多行但没有带有'true'
指示符的案例。这样我就可以解释你的问题了。【参考方案2】:
你可以使用窗口函数:
select *
from (select t.*, count(*) over(partition by casenum) cnt from table1 t) t
where t.primindicator = 'true' or cnt = 1
【讨论】:
以上是关于根据不同列中的值删除重复项的主要内容,如果未能解决你的问题,请参考以下文章
如何使用python pandas删除csv中列中的精确重复项