【问题标题】:Remove duplicate records except the first record in SQL删除 SQL 中除第一条记录外的重复记录
【发布时间】:2018-02-17 10:47:49
【问题描述】:

我想删除除第一个之外的所有重复记录。

喜欢:

NAME
R
R
rajesh
YOGESH
YOGESH

现在我想删除上面的第二个“R”和第二个“YOGESH”。

我只有一列名称为“NAME”。

【问题讨论】:

  • 删除或选择唯一值?
  • 删除重复但仅除第一个。
  • 如果它们相同,你怎么知道它是否是第一个?这真的很重要吗?而且由于您只有一列,因此没有第一列,因为表是无序集。
  • 我的意思是要删除但不是所有的重复。
  • @YogeshSharma 该表中的任何Primary Key

标签: sql sql-server tsql select duplicates


【解决方案1】:

使用 CTE(我有几个在生产中)。

;WITH duplicateRemoval as (
    SELECT 
        [name]
        ,ROW_NUMBER() OVER(PARTITION BY [name] ORDER BY [name]) ranked
    from #myTable
    ORDER BY name
)
DELETE
FROM duplicateRemoval
WHERE ranked > 1;

说明:CTE 将获取您的所有记录并为每个唯一条目应用一个行号。每个额外的条目将获得一个递增的数字。将DELETE 替换为SELECT * 以查看它的作用。

【讨论】:

  • 如果超过 2 个,将 where 谓词更改为 > 1。:)
  • @SeanLange 你是绝对正确的 - 我更新了。
  • @Eli 感谢您的支持。
【解决方案2】:

看起来像一个简单的 distinct 修饰符就可以解决问题:

SELECT DISTINCT name
FROM   mytable

【讨论】:

    【解决方案3】:

    这是更大的代码,但它可以完美地工作在你不取原始行但找到所有重复行的地方

        select majorTable.RowID,majorTable.Name,majorTable.Value from 
        (select outerTable.Name, outerTable.Value, RowID, ROW_NUMBER() 
    over(partition by outerTable.Name,outerTable.Value order by RowID)
         as RowNo from @Your_Table outerTable inner join
        (select Name, Value,COUNT(*) as duplicateRows  FROM @Your_Table group by Name, Value 
    having COUNT(*)>1)innerTable on innerTable.Name = outerTable.Name 
        and innerTable.Value = outerTable.Value)majorTable where MajorTable.ROwNo <>1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 2020-07-16
      • 2021-02-13
      • 2016-01-07
      相关资源
      最近更新 更多