每小时删除重复条目

ice*_*fex 4 postgresql

我最近问了关于 MySQL 的同样问题,它已经迁移到 Postgres。 老问题

把它们加起来:

我有一个带有 id(类型 UUID)、时间戳和一些文本(row3)的表。如何为 row3 的每个不同值每小时仅保留一个条目?

我试过的是这样的:

INSERT INTO log_table
SELECT * FROM table1
WHERE id IN (
    SELECT DISTINCT ON(id) id
    FROM table1
    GROUP BY row3, EXTRACT(HOUR FROM "time"), id
);
TRUNCATE table1;
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这会插入 table1 中的每一行。

dez*_*zso 5

通用案例

假设您想保留属于max(id)每小时和每个不同row3值的值(但请参阅下面的 UUID 部分)。您通过查询获得的这些 ID

SELECT max(id)
FROM table1
GROUP BY row3, EXTRACT(hour FROM "time")
;
Run Code Online (Sandbox Code Playgroud)

(这将从您的数据中省略日期,这可能是您想要的——也可能不是。在后一种情况下,您可能想date_trunc('hour', "time")改用。)

然后你可以使用上面的查询来填充,就像你在你的问题做了一个表,或删除一切table1

DELETE FROM table1
WHERE id NOT IN (
    [the query above comes here]
)
;
Run Code Online (Sandbox Code Playgroud)

用户名

max()UUID没有。因此,您的情况需要另一种解决方案,例如:

SELECT DISTINCT first_value(id) OVER w
FROM table1
WINDOW w AS (PARTITION BY row3, EXTRACT(hour FROM "time")
             RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
;
Run Code Online (Sandbox Code Playgroud)

这个应用了一个窗口函数,分组是通过PARTITION BY子句 and来实现的DISTINCT

(致谢:感谢 AndriyM 的想法!)