如何删除具有重复列组合的行

How to delete rows that have duplicate column combination

我需要删除一些具有相同列组合(ID 除外)的行。应保留的行是具有最大参考日期的行

ID      Column1 Column2   RefDate
GUID1   34578   BRKNRI    2018-05-03
GUID2   34578   BRKNRI    2018-05-02
GUID3   12381   BRSAPR    2018-05-03
GUID4   12381   BRSAPR    2018-05-02
GUID5   12381   BRSAPR    2018-05-01

所以查询后table应该是这样的

ID      Column1 Column2   RefDate
GUID1   34578   BRKNRI    2018-05-03
GUID3   12381   BRSAPR    2018-05-03

我知道下面的查询将 return 我想要的 table,但我不知道如何删除“重复”条目并只留下最大日期的条目。

SELECT Column1,
       Column2,
       max(RefDate) as MaxDate
FROM Table
GROUP BY Column1, Column2)

你可以尝试使用删除JOIN

DELETE t1
FROM [Table] t1
INNER JOIN (
  SELECT Column1,
       Column2,
       max(RefDate) as MaxDate
  FROM [Table]
  GROUP BY Column1, Column2
) t2
  ON t1.Column1 = t2.Column1
 AND t1.Column2 = t2.Column2
 AND t1.RefDate <> t2.MaxDate

或使用EXISTS子查询。

DELETE t1
FROM [Table] t1
WHERE EXISTS (
  SELECT 1
  FROM [Table] t2
  WHERE t1.Column1 = t2.Column1
  AND t1.Column2 = t2.Column2
  HAVING max(t2.RefDate) <> t1.RefDate
)

sqlfiddle

您应该首先验证您的 select 是否确实找到了您不想删除的那些行。如果是这种情况,您可以使用以下命令删除所有其他行:

    DELETE FROM yourtable where id NOT IN
    (SELECT id FROM 
    (SELECT id,
    Column1,
    Column2,
    max(RefDate) as MaxDate
    FROM yourtable
    GROUP BY Column1, Column2))

您可以使用 ROW_NUMBER() 根据 Column1 ,Column2 对数据进行分区 然后过滤 ROW_NUMBER() 值大于 1 的数据以获取重复记录。

删除那些idS。

DELETE from ID where id IN
(
select  id FROM 
(
select id, Column1 ,Column2 ,RefDate,
ROW_NUMBER() OVER( PARTITION BY Column1 ,Column2 ORDER BY Column1 ,Column2) AS temp_var
from id
)  t
where t.temp_var >1 ) ;