【问题标题】:How to find duplicate rows in a table in SQL Server如何在 SQL Server 中查找表中的重复行
【发布时间】:2021-03-01 06:00:23
【问题描述】:

我有一个名为 PropertyValues 的表,有 4 列

NamePropertyIDPropertyUnitIDPropertyTypeID

由于那里有 19422 行,我想知道是否有任何重复的条目,它们在所有 4 列中具有完全相同的值。

我知道我能做到:

SELECT COUNT(Id) AS Expr1
FROM PropertyValues
WHERE (Name = 'Abc') 
  AND (PropertyID = '5') 
  AND (PropertyUnitID = '15') 
  AND (PropertyTypeID = '37')

这告诉我这个值组合在表中出现了多少次 - 但这当然只适用于一种值组合。

我基本上需要它来告诉我哪一行在表格中不止一次,并返回这些行的 ID,最好按名称分组。你能帮帮我吗?

【问题讨论】:

    标签: sql sql-server count duplicates having-clause


    【解决方案1】:

    一个选项使用聚合:

    select Name, PropertyID, PropertyUnitID, PropertyTypeID, count(*)
    from PropertyValues
    group by Name, PropertyID, PropertyUnitID, PropertyTypeID
    having count(*) > 1
    

    这会带来不止一行出现的元组。

    如果您想要对此类行进行总体计数,请使用其他级别的聚合:

    select count(*)
    from (
        select Name, PropertyID, PropertyUnitID, PropertyTypeID
        from PropertyValues
        group by Name, PropertyID, PropertyUnitID, PropertyTypeID
        having count(*) > 1
    ) t
    

    最后,如果你想要整行,那么使用窗口函数:

    select *
    from (
        select p.*, 
            row_number() over(partition by Name, PropertyID, PropertyUnitID, PropertyTypeID) rn
        from PropertyValues p
    ) p
    where rn > 1
    order by Name, PropertyID, PropertyUnitID, PropertyTypeID
    

    【讨论】:

    • 感谢您的回答。如果我运行第二个代码,我会得到返回的计数 5899。当我想使用您的第三个代码检查行时,我收到错误 SQL text cannot be represented in the grid pane and diagram pane. - 我在 SSMS 中运行它。是不是因为我在问题中没有提到更多行,因为它们对比较不感兴趣? - 我要睡觉了,我明天再来看看。谢谢!
    【解决方案2】:

    你可以使用窗口函数:

    select pv.*
    from (select pv.*,
                 count(*) over (partition by Name, PropertyID, PropertyUnitID, PropertyTypeID) as cnt
          from propertyvalues pv
         ) pv
    where cnt >= 2;
    

    这将返回整行。如果你只想要id,你可以使用select id

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 2011-02-21
      • 2020-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      相关资源
      最近更新 更多