这段代码给了我一个唯一值的表(没有重复(:
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
的语法。
假设firstname
、lastname
和startdate
中的值从来都不是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