【问题标题】: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

【问题讨论】:

    标签: sql sql-server count subquery aggregate-functions


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      相关资源
      最近更新 更多