【问题标题】:Select only duplicate records based on few columns根据几列仅选择重复记录
【发布时间】:2012-03-27 13:01:05
【问题描述】:

我有一个 3 列的表。它在第 2 列和第 3 列有重复。我需要选择重复的行(包含所有 3 列)。怎么做?请帮助我。

var1 var2 var3

a a a
b a a
c a a
d b b
e c c

以上是表结构。它有 3 列 var1、var2、var3。仅基于列 var2 和 var3,我们必须假设它是重复记录。我们不应该在查找重复项时考虑 var1。对对齐感到抱歉。

我使用下面的查询来获取所有有/没有重复但具有识别重复记录的排名的行。但我不能只得到重复的记录。

select var1,var2,var3,ROW_NUMBER() over(PARTITION BY var2,var3 order by var2,var3) as rnk from vart

除此之外,我如何获得重复条目中的最大排名记录? 谢谢。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    如果您想要所有有重复的行,您可以使用count(*) over()

    select var1, var2, var3
    from (
          select var1,
                 var2,
                 var3,
                 count(*) over(partition by var2, var3) as dc
          from YourTable
         ) as T
    where dc > 1
    

    结果:

    var1 var2 var3
    ---- ---- ----
    a    a    a
    b    a    a
    c    a    a
    

    如果您想要所有重复但只有一个,请改用row_number() over()

    select var1, var2, var3
    from (
          select var1,
                 var2,
                 var3,
                 row_number() over(partition by var2, var3 order by var1) as rn
          from YourTable
         ) as T
    where rn > 1
    

    结果:

    var1 var2 var3
    ---- ---- ----
    b    a    a
    c    a    a
    

    【讨论】:

      【解决方案2】:

      你的主键是什么?如果 var1 是,请尝试:

      select var1
      from vart
      group by var2+var3
      having count(*)>1
      

      如果不是,请尝试:

      select * from vart where pk in
      (
          select pk
          from vart
          group by var2+var3
          having count(*)>1
      )
      

      【讨论】:

        【解决方案3】:
        select var1,var2,var3 from vart where (var2+'#'+var3) in 
        (
           select var2+'#'+var3 from vart group by var2,var3 having count(var1) > 1
        )
        

        【讨论】:

        • 列 'vart.var1' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。
        • 已修改查询。虽然它可能有点低效。我不知道如何在 IN 子句中有多个字段
        【解决方案4】:

        使用您的查询,您可以使用 CTE 扩展它并做您想做的事情

        with cte as
        (
        select var1,var2,var3,ROW_NUMBER() over(PARTITION BY var2,var3 order by var2,var3) as rnk from vart
        )
        select * from cte where rnk > 1
        

        这将列出所有“重复”行。

        您也可以使用 cte 删除受骗者:

        with cte as
        (
        select ROW_NUMBER() over(PARTITION BY var2,var3 order by var2,var3) as rnk from vart
        )
        delete from cte where rnk > 1
        

        【讨论】:

          猜你喜欢
          • 2014-02-01
          • 2012-08-08
          • 2021-03-16
          • 1970-01-01
          • 2011-08-05
          • 1970-01-01
          • 2022-10-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多