我需要删除每个表ID的所有重复项,除了一个之外。像下面这样。我需要删除valueid上01,02,03的所有副本。。。
原件:
id | valueid | data
____________________________
01 | 1001 | datadata1
01 | 1002 | datadata2
01 | 1001 | datadata1
02 | 1323 | datamoredata123
02 | 1323 | datamoredata123
03 | 22123 | evenmoredata
03 | 24444 | andalsomore
应该这样结束:
id | valueid | data
____________________________
01 | 1001 | datadata1
01 | 1002 | datadata2
02 | 1323 | datamoredata123
03 | 22123 | evenmoredata
03 | 24444 | andalsomore
我试着用这样的东西来做,但是我不知道我怎么才能在id上删除这些内容
WITH CTE AS(
SELECT valueid,
RN = ROW_NUMBER()OVER(PARTITION BY valueid ORDER BY valueid)
FROM tblvalues
)
DELETE FROM CTE WHERE RN > 1
有什么建议吗?
提前感谢
一种非常简单的方法是在列中添加唯一索引(valueid)。编写ALTER语句时,请指定IGNORE关键字。
ALTER IGNORE TABLE tblvalues
ADD UNIQUE INDEX idx_name (valueid);
这将删除所有重复的行。作为一个额外的优点,将来重复的INSERT将是错误的。像往常一样,您可以在运行这样的东西之前进行备份。
你很接近了。您需要通过子句更改分区。您希望每个
id
/value eid
对都有一行,所以这两行都应该在分区子句中:
WITH todelete AS (
SELECT valueid,
RN = ROW_NUMBER() OVER (PARTITION BY id, valueid ORDER BY data)
FROM tblvalues
)
DELETE FROM todelete WHERE RN > 1;
您需要将id
列添加到分区
:
WITH CTE AS(
SELECT valueid,
RN = ROW_NUMBER()OVER( PARTITION BY id, valueid ORDER BY data)
FROM tblvalues
)
DELETE FROM CTE WHERE RN > 1
这样,您可以分别为每个id删除重复的value eid
值。列data
确定删除哪些重复项。
请注意,在转向您之前,我已经浏览了各种帖子。事实上,我尝试实现中提供的解决方案:基于“notin”条件从数据帧中删除行 我的问题如下。让我们假设我有一个巨大的数据帧,我想删除重复的数据帧。我很清楚我可以使用drop_duplicates,因为这是最快的最简单的方法。然而,我们的老师希望我们创建一个包含重复项ID的列表,然后根据这些值是否包含在上述列表中删除它们。 现在,让我们看看输出: 因此,我得
问题内容: 如何从以以下方式设置的表中删除重复项? 一个工作人员可以有多个与他们相关联的type_ID,我想删除所有重复的类型。如果有重复项,我想删除具有最新条目的类型。 问题答案: 窗口函数row_number()的教科书候选: 这也照顾了一组相同的受骗者的情况。 请参阅有关data.SE的简化演示。 更新较简单的版本 事实证明,这可以简化:在SQL Server中,您可以直接从CTE中删除:
问题内容: 我有这样的桌子 我想执行一个查询,以除去所有最新的重复项。我希望你有个主意吗? 例如,查询后的表必须是这样的 问题答案: 语法可能需要调整,但是应该做到这一点。此外,您可能希望将子查询预查询到其自己的表FIRST中,然后对该结果集运行DELETE FROM。
问题内容: 我有一个自定义对象的ArrayList。我要删除重复的条目。 对象具有三个字段:和。如果字幕多次出现,那么我只需要带有thats字幕的第一项(忽略带有该字幕的其余对象)。 问题答案: 您可以使用自定义Comparator将ArrayList的内容放入TreeSet中,如果两个字幕相同,则应返回0。之后,您可以将Set转换为列表,并使列表中没有“重复项”。这是对象的示例,您当然应该使用正
问题内容: 数据库类型为PostGres 8.3。 如果我写了: 我有一些计数超过1的行。如何取出重复的行(我仍然希望每个行都保留1行,而不是+1行…我不想删除所有行。) 例子: 应该变成: 我找到的唯一答案是 在那里,但是我想知道是否可以在没有哈希列的情况下做到这一点。 警告 我没有具有唯一编号的PK,因此无法使用min(…)技术。PK是3个字段。 问题答案: 这是所有表都应具有主键的众多原因之
我有一个数据帧,在a列中有重复值。我想删除重复值,保留b列中值最高的行。 所以这个: 应该变成这个: 我猜可能有一种简单的方法可以做到这一点——可能就像在删除重复项之前对数据帧进行排序一样简单——但我对groupby的内部逻辑了解不够,无法搞清楚。有什么建议吗?