从 SQL 表中清除早于 <date/time> 的记录,保留最新的旧记录

问题描述 投票:0回答:1

我有一个 SQL 表(Postgres):

CREATE TABLE (
  "id" BIGINT NOT NULL PRIMARY KEY,
  "changedAt" TIMESTAMP NOT NULL,
  "familyId" VARCHAR(12) NOT NULL,
  ... (other columnds left out for clarity)
)

我们正在此表中获取大量更新(记录),并且希望仅保留不超过 90 天的更新(记录)。诀窍是,如果“familyId”自 90 天以来没有任何更新,我们需要保留最新的旧 ID。如果 90 天内有更新,这也适用。

对于以下数据:

1, 2024-04-12 13:20:23, "Test 1", ...
2, 2024-03-12 13:20:23, "Test 1", ...
3, 2024-01-01 13:20:23, "Test 1", ...
4, 2022-01-12 13:20:23, "Test 1", ...

3 和 4 都超过 90 天,但我希望保留第 3 个以完整覆盖过去 90 天的数据。

如何构建 DELETE 查询来实现此目的? 哪些索引可以帮助查询更快?

我自己不知道如何处理这种情况。

sql postgresql
1个回答
0
投票

尝试这样的事情(只需纠正语法,它可能已损坏)

delete from table1 where id in 
( 
    select id from (
    select id, familyId, row_number over (partition by familyId order by changedAt desc) as rn
    where changedAt < dateadd("day",now(), -90)
    ) q1 where rn <> 1
)
© www.soinside.com 2019 - 2024. All rights reserved.