我有一张桌子

agent_audit_log(id, agent_id, api/text, at/timestamp)

目前,我的家政服务有

DELETE FROM agent_audit_log WHERE at < NOW()  - INTERVAL '60 days';

我想删除所有超过each条最新记录的审计日志(log),而不是上面提到的"each"agent_id. 这就是我所知道的一切

DELETE FROM agent_audit_log WHERE id NOT IN (SELECT id FROM agent_audit_log ORDER BY at DESC LIMIT 100);

但这需要针对每个代理进行.

推荐答案

问题是要 Select 正确的ID,但您可以使用

CREATE tABLE agent_audit_log(id int, agent_id int , api text, at timestamp)
CREATE TABLE
INSERT INTO agent_audit_log VALUES (1,1,'A',now()), (2,1,'B',now()),(3,2,'A',now()), (4,2,'B',now())
INSERT 0 4
DELETE FROM agent_audit_log 
  WHERE id NOT IN (SELECT MIN(id) FROM agent_audit_log GROUP BY agent_id);

DELETE 2
SELECT * FROM agent_audit_log
id agent_id api at
1 1 A 2023-06-16 22:11:16.919099
3 2 A 2023-06-16 22:11:16.919099
SELECT 2
INSERT INTO agent_audit_log VALUES (2,1,'A',now()), (4,2,'A',now()),(6,1,'A',now()), (6,2,'A',now())
INSERT 0 4
WITH CTE AS (
  SELECT id, ROW_NUMBER() OVER(PARTITION BY agent_id ORDER BY at) rn 
  FROM agent_audit_log)
DELETE FROM agent_audit_log 
  WHERE id NOT IN (SELECT id FROM CTE WHERE rn = 1);

DELETE 4
  SELECT *
  FROM agent_audit_log
id agent_id api at
1 1 A 2023-06-16 22:11:16.919099
3 2 A 2023-06-16 22:11:16.919099
SELECT 2

fiddle

Sql相关问答推荐

Postgresql -如何计算刷卡和刷卡时间

SQL查询视图与连接?

Select 起始参数和截止参数之间的间隔,包括与期间重叠的参数

返回包含列和包含其他列的列表的自定义查询

更新其组的日期字段值小于最大日期减go 天数的记录

在数据库中搜索列

OVER子句WITH PARTITION BY和ORDER BY忽略主查询的WHERE子句

我怎样才能得到列值对应的最大值在另一个?

如何在presto中映射id与名称

多条件SQL排序行为

在SQL中,筛选其他列中只有一个值的ID

SAS proc freq 或 proc sql 获取数据子集和整个数据的频率

DbUp for sqlserver 在 dbo 授权下为非 dbo 用户创建架构

SQL 查询是否返回列表中仅包含某些值而不包含其他值的行?

将一名成员金额分配给群组内的其他成员

如何在第二个 INSERT 中使用第一个 INSERT 自动生成的 ID

清理 XML 数据

根据不同日期标准分配组的逻辑

如何对 jsonb 中的字段执行求和,然后使用结果过滤查询的输出

在多个表上递归查找