删除部分重复行 - sql

问题描述 投票:0回答:3

我在删除部分重复行时遇到一些麻烦

结构是这样的:

+-----+--------+--+-----------+--+------+
| id  | userid |  | location  |  | week |
+-----+--------+--+-----------+--+------+
|   1 |    001 |  | amsterdam |  |   11 |
|   2 |    001 |  | amsterdam |  |   23 |
|   3 |    002 |  | berlin    |  |   28 |
|   4 |    002 |  | berlin    |  |   22 |
|   5 |    003 |  | paris     |  |   19 |
|   6 |    003 |  | paris     |  |   35 |
+-----+--------+--+-----------+--+------+

我只需要从每个用户ID中保留一行,它有哪一周的数字并不重要。

谢谢, 马克西姆

sql-server
3个回答
0
投票

这应该适用于大多数数据库:

DELETE
FROM yourTable
WHERE id <> (SELECT MIN(id)
              FROM yourTable t
              WHERE t.userid = userid)

此查询将从每个

userid
组中删除所有记录 除了该组具有最低 id
 的记录。  我认为 
id
 是一个独特的列。


0
投票
这个方法已经测试过了,试试吧。 我们获取每条记录中出现的行数,然后仅删除出现超过 1 行的行...保留原始记录。

BEGIN TRANSACTION SELECT UserID, Location, RN = ROW_NUMBER()OVER(PARTITION BY UserID, Location ORDER BY UserID, Location) into #test1 FROM dbo.MyTbl Delete MyTbl From MyTbll INNER JOIN #test1 ON #test1.UserID= MyTbl.UserID WHERE RN > 1 if @@Error <> 0 GOTO Errlbl Commit Transaction RETURN Errlbl: RollBack Transaction GO
    

0
投票
实际上不要删除添加一个名为 delflag 和 active 的列,如果你想查看需要列出的数据设置 active = 1 和 delflag = 0 如果 delflag = 1,这可能会帮助您将数据保留为已删除状态,并且当您想要修改数据并保留在表中时,您可以将该行更新为 active = 1 并且还在表创建的 UserId 列中使用主键和 Identity(0,1),它也可能根据 sql 风格而变化

© www.soinside.com 2019 - 2024. All rights reserved.