sql - T-SQL 根据列删除重复项

标签 sql sql-server tsql

屏幕截图显示了表格的前 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 并执行再次查询。

关于sql - T-SQL 根据列删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46189505/

相关文章:

sql - 比较 SQL 中的两个位掩码以查看是否有任何位匹配

c# - 在存储过程调用中使用默认参数

sql - 使用目标为列的 MySQL 的 "IN"函数?

sql - Oracle 慢查询

mysql - SQL - 使用 Case、When 对不同行的值求和

mysql - 连接2个表的SQL查询

mysql - 查询获取一个表中不存在的值,同时与另一个表进行比较

sql - 选择范围内的最小数字

sql-server - 您可以搜索 SQL Server 2005 存储过程内容吗?

SQL Server 通过左连接和分组进行更新