我可以根据温度 table 删除 rows/replace table
Can I delete rows/replace table based on temp table
此代码为我提供了 table 个唯一值(不重复):
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;
什么语法可以用这个语法的结果替换当前的 table?
或者,我可以使用 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)
是一种很差的身份建立方式,同名的人很多,demo可能会简化...)
startdate
中可以有相同的值吗?那么你需要一个决胜局...
通常比使用带有 row_number()
的子查询更快。有一百零一种方法可以加快速度,具体取决于您的具体情况和要求。参见:
- How do I (or can I) SELECT DISTINCT on multiple columns?
如果比较的列可以是 NULL
,请考虑:
- How to delete duplicate rows without unique identifier
duplicate-removal. Combine it with postgres 有一个完整的专用标签来缩小范围:
此代码为我提供了 table 个唯一值(不重复):
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;
什么语法可以用这个语法的结果替换当前的 table?
或者,我可以使用 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)
是一种很差的身份建立方式,同名的人很多,demo可能会简化...)
startdate
中可以有相同的值吗?那么你需要一个决胜局...
通常比使用带有 row_number()
的子查询更快。有一百零一种方法可以加快速度,具体取决于您的具体情况和要求。参见:
- How do I (or can I) SELECT DISTINCT on multiple columns?
如果比较的列可以是 NULL
,请考虑:
- How to delete duplicate rows without unique identifier
duplicate-removal. Combine it with postgres 有一个完整的专用标签来缩小范围: