繁体   English   中英

T-SQL基于列删除重复项

[英]T-SQL delete duplicates based on a column

屏幕截图显示了表的前8行。 对于相同的ID(每个ID具有数千行),基于相同的“ updatetime”,我只想保留第一行,删除其余行。 例如,在这里我要删除第3、5、8行。 两行的所有列都可以完全相同(此处,当updatetime相同时,UpdateMillisec不同,但不是必需的)。 屏幕截图是查询的结果,我现在没有主键(屏幕截图中最左边的列现在在表中不可用)。 我应该写什么SQL代码? 提前致谢!

Screeshot

有一种简单的方法可以删除重复的行。

第一步,我们将对记录进行排序并添加一个行号。
第二步将删除行号> 1的行。

WITH CTE AS
(
SELECT  *
       ,ROW_NUMBER() OVER 
                (PARTITION BY id, updatetime
                     ORDER BY id, updatetime, UpdateMillisec ASC
                     ) AS RowNum
  FROM yourtable

)
SELECT * FROM CTE                    -- for checking the result before deleting
-- DELETE FROM CTE WHERE RowNum > 1  -- uncomment this row for the final DELETE

注意:
为了识别哪个是第一条记录,哪些是第二条(第二条,第三条..)记录,我们必须对数据进行排序。
删除它们之前,请始终先使用SELECT * FROM CTE检查结果集

在您的情况下,我检查了上述查询的结果集,即:

id  lastprice   updatetime          UpdateMillisec  RowNum
211709  51370   09:30:00.0000000    500             1
211709  51380   09:30:01.0000000    0               1
211709  51370   09:30:01.0000000    500             2
211709  51370   09:30:02.0000000    0               1
211709  51370   09:30:02.0000000    500             2
211709  51370   09:30:03.0000000    0               1
211709  51370   09:30:04.0000000    0               1
211709  51370   09:30:04.0000000    500             2

如我们所见,您要删除的那些记录恰好具有RowNum =2。因此,最后我们可以将SELECT *更改为DELETE并再次执行查询。

提供按列划分的行号并按time列排序,然后删除不需要的行。

询问

;with cte as(
    select [rn] = row_number() over(
        partition by [id], [lastprice], [updatetime] 
        order by [id], [updatetime], [updateMillisec]
    ), *
    from [your_table_nam]
)
select * from cte -- first select and check whether these are the rows that has to be deleted
where [rn] > 1;

如果可以,则删除[rn]大于1

delete from cte
where [rn] > 1;

我喜欢@Estban P.的解决方案。 我很想进一步尝试。 事实证明,也可以这样做:

DELETE seq FROM (SELECT ROW_NUMBER() 
       OVER(PARTITION BY id, updatetime ORDER BY id, updatetime, updatems ASC) AS RowNum
FROM tbl ) seq where rownum>1;

因此,您甚至不必使用CTE,请参阅此处的演示http://rextester.com/VLZOD12591

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM