我想知道如何删除表中确切重复的行并仅保留其中一行。 例如这个桌子。
到
我读到的大多数线程都利用了id
或unique_key
,在这种情况下我没有。
编辑:当我说remove
时,我是说delete
来自表中的记录,而我又没有ID来创建保持条件的引用一条记录。抱歉造成混乱。
谢谢。
这可能是与其他线程相同的问题。但是,他们未能解释什么faid成功实现了ctid。因此,我想说的是我用相同的词但不同的问题问的内容。请删除“标记重复项”。谢谢。
答案 0 :(得分:2)
您可以在下面尝试
如果您需要专门针对重复的记录,则可以使用内部ctid字段,该字段唯一地标识一行:
DELETE FROM yourtablename
WHERE ctid NOT IN (
SELECT MIN(ctid)
FROM yourtablename
GROUP BY date, value, label,sequence
)
答案 1 :(得分:0)
在这种情况下您可以做到
SELECT DISTINCT * FROM mytable
给定您共享的输入,这将仅包含不同的行并产生相同的输出。
但是,请注意,这仅在所有字段均相等时才有效。
例如,如果您的表具有json列,则上述方法将不起作用,因为postgresql无法知道如何比较两个json对象是否相等。
答案 2 :(得分:0)
从mytable中选择不同的*
答案 3 :(得分:0)
DELETE FROM dupes a
WHERE a.ctid <> (SELECT min(b.ctid)
FROM dupes b
WHERE a.key = b.key);