根据不同列中的值删除重复项

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

【讨论】:

以上是关于根据不同列中的值删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

从文本文件中删除每个单独列中的重复项

使用 pandas 和 Python 删除重复项

如何使用python pandas删除csv中列中的精确重复项

删除表格中的重复单元格

使用 R 如何删除基于多列的重复项,但选择重复项的“最完整”版本

根据列子集删除重复项,保留列 E 中具有最高值的行,如果 E 中的值相等,则列 B 中具有最高值的行