我最近问了关于 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 中的每一行。
假设您想保留属于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 的想法!)
归档时间: |
|
查看次数: |
1190 次 |
最近记录: |