gpt4 book ai didi

sql - Postgres通过排序删除所有重复记录但一个

转载 作者:行者123 更新时间:2023-11-29 12:07:47 26 4
gpt4 key购买 nike

我想知道,在 Postgres 中,如何通过按列排序删除所有重复记录,但只删除一个记录。

假设我有下表foo:

 id                 | name |  region   |          created_at
--------------------+------+-----------+-------------------------------
1 | foo | sydney | 2018-05-24 15:40:32.593745+10
2 | foo | melbourne | 2018-05-24 17:28:59.452225+10
3 | foo | sydney | 2018-05-29 22:17:02.927263+10
4 | foo | sydney | 2018-06-13 16:44:32.703174+10
5 | foo | sydney | 2018-06-13 16:45:01.324273+10
6 | foo | sydney | 2018-06-13 17:04:49.487767+10
7 | foo | sydney | 2018-06-13 17:05:13.592844+10

我想通过检查 (name, region) 元组来删除所有重复项,但保留具有最大 created_at 列的那个。结果将是:

 id                 | name |  region   |          created_at
--------------------+------+-----------+-------------------------------
2 | foo | melbourne | 2018-05-24 17:28:59.452225+10
7 | foo | sydney | 2018-06-13 17:05:13.592844+10

但我不知道从哪里开始。有什么想法吗?

最佳答案

使用带有 ROW_NUMBERPARTITION BY 的子查询来过滤掉具有重复区域的行,同时保留每个区域中的最新行。确保您的子查询使用 AS 关键字来防止 Postgre 语法错误:

SELECT * 
FROM foo
WHERE id IN (
SELECT a.id
FROM (
SELECT id, ROW_NUMBER() OVER (
PARTITION BY region
ORDER BY created_at DESC
) row_no
FROM foo
) AS a
WHERE row_no > 1
);

... 返回要删除的行。当您对删除行的结果感到满意时,将 SELECT * 替换为 DELETE

SQLFiddle demo

关于sql - Postgres通过排序删除所有重复记录但一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52827420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com