Sql server 仅删除一个重复行的sql查询

Sql server 仅删除一个重复行的sql查询,sql-server,Sql Server,我有一张表,里面有一些重复的行。我只想删除一个重复的行 例如,I'v 9个重复行,因此应仅删除一行,并应显示剩余的8行 范例 称为持续时间timestamp的日期调用 2012-06-19 10:22:45.000 165 218 155 1.9 121 2012-06-19 10:22:45.000 165 218 155 1.9 121 2012-06-19 10:22:45.000 165 218 155 1.9 121 2012-06-19 10:22:45.000 165 218 15

我有一张表,里面有一些重复的行。我只想删除一个重复的行

例如,I'v 9个重复行,因此应仅删除一行,并应显示剩余的8行

范例

称为持续时间timestamp的日期调用

2012-06-19 10:22:45.000 165 218 155 1.9 121
2012-06-19 10:22:45.000 165 218 155 1.9 121
2012-06-19 10:22:45.000 165 218 155 1.9 121
2012-06-19 10:22:45.000 165 218 155 1.9 121
从上述日期开始,应仅删除一行,并应显示3行

2012-06-19 10:22:45.000 165 218 155 1.9 100
2012-06-19 10:22:45.000 165 218 155 1.9 100
2012-06-19 10:22:45.000 165 218 155 1.9 100
从上述日期开始,应仅删除一行,并应显示两行


我该怎么做?

表上有主键吗

什么使一行重复?同一时间?同一天?所有列都相同吗

如果您有主键,则可以使用TOP功能仅选择一条记录并删除该行:

Delete from [tablename] where id in (select top 1 id from [tablename] where [clause])

如果您不介意这些行的顺序,MySQL中有一个命令:

DELETE TOP (numberOfRowsToDelete) FROM db.tablename WHERE {condition for ex id = 5};

对于SQL Server 2005+您可以执行以下操作:

;WITH CTE AS
(
    SELECT  *, 
            ROW_NUMBER() OVER(PARTITION BY [date], calling, called, duration, [timestamp] ORDER BY 1) RN
    FROM YourTable
)
DELETE FROM CTE
WHERE RN = 2

此解决方案允许您从每组副本中删除一行(而不是一次只处理单个副本块):


另外,对于列名来说,
[date]
[timestamp]
都是糟糕的选择…

由于我没有模式,我想分步骤找到一个可能的解决方案:

  • 将行号应用于所有列的选择
  • 使用这些列创建一个分组,并删除每个组中的最小值(行数)
  • 编辑:


    rownumber位于内部查询中,所有行中的rownumber都将递增。在外部查询中,我使用内部查询的group by并为每个组选择min(行编号)。由于每个组都由重复的行组成,因此我会删除每个组的最小值(行数)。

    使用
    LIMIT 1
    将帮助您仅删除与
    delete
    查询匹配的
    1行

    DELETE FROM `table_name` WHERE `column_name`='value' LIMIT 1;
    
    之前

    +----------------------+
    | id  |  column_name   |
    +-----+----------------+
    | 1   |  value         |
    +-----+----------------+
    | 2   |  value         |
    +-----+----------------+
    | 3   |  value         |
    +-----+----------------+
    | 4   |  value         |
    +-----+----------------+
    
    之后

    +----------------------+
    | id  |  column_name   |
    +-----+----------------+
    | 1   |  value         |
    +-----+----------------+
    | 2   |  value         |
    +-----+----------------+
    | 3   |  value         |
    +-----+----------------+
    

    请格式化数据,使其更易于阅读。列出了五列名称,但输出中有六列。最后一列是如何从121变为100的?如果源有两行121和两行100,您会删除两行还是一行?(换句话说,是否仅基于日期进行复制?)当然,您可以使用NEWHERE语句指定要删除的日期。如果按相同的列进行分区,则请求SQL Server solution.MIN的OP对于每个组始终为1。这意味着您还将删除不具有重复项的行,除非您还添加了具有重复项的行。这使得它比已经发布的解决方案更加复杂,IMHO。@AaronBertrand nop,rownumber在一个内部查询中,所有行的rownumber都会递增。在外部查询中,我使用内部查询的group by并为每个组选择min(行编号)。因为每个组都是由重复的行组成的,所以我删除了每个组的min(rownumber)。你明白吗?有更好的描述,当然,但与你的第一个描述不符。代码会更有用,更容易解释;当x为@User6675636b20796f7521时,它被称为a。
    +----------------------+
    | id  |  column_name   |
    +-----+----------------+
    | 1   |  value         |
    +-----+----------------+
    | 2   |  value         |
    +-----+----------------+
    | 3   |  value         |
    +-----+----------------+