如何删除具有重复列组合的行
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
)
您应该首先验证您的 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 ) ;
我需要删除一些具有相同列组合(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
)
您应该首先验证您的 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 ) ;