我可以根据临时表删除行/替换表吗



这段代码给了我一个唯一值的表(没有重复(:

SELECT id, firstname, lastname, startdate, position
FROM  (
SELECT id, firstname, lastname, startdate, position,
ROW_NUMBER() OVER (PARTITION BY (firstname, lastname) ORDER BY startdate DESC) rn
FROM people
) tmp
WHERE rn = 1;

什么语法可以用这个表的结果替换当前表?

或者,我可以使用WHERE rn <> 1来获取我想要删除的所有数据,但同样,我很难使用这种方法来正确获取DELETE的语法。

假设firstnamelastnamestartdate中的值从来都不是NULL,这个带有NOT EXISTS反半联接的简单查询可以完成以下任务:

DELETE FROM people AS p
WHERE  EXISTS (
SELECT FROM people AS p1
WHERE  p1.firstname = p.firstname
AND    p1.lastname  = p.lastname
AND    p1.startdate > p.startdate
);

它删除存在较新副本的每一行,有效地保留了每组对等体的最新行。(当然,(firstname, lastname)是一种建立身份的糟糕方式。有很多名字相同的不同的人。演示可能会简化…(

startdate中可以有相同的值吗?那你需要抢七。。。

通常比使用row_number()的子查询更快。根据您的具体情况和要求,有一百一十种方法可以加快速度。参见:

  • 如何(或可以(在多列上选择DISTINCT

如果比较的列可以是NULL,则考虑:

  • 如何删除没有唯一标识符的重复行

有一个完整的专用标签用于重复删除。将其与postgres结合以缩小范围:

  • https://stackoverflow.com/questions/tagged/duplicates+postgresql

相关内容

  • 没有找到相关文章

最新更新