Dmi*_*405 2 sql postgresql rows sql-delete
我需要在表中保留用户的最后5个搜索结果.
我写了一个脚本来删除其他行,但它不起作用:
DELETE FROM
SELECT
ROW_NUMBER () OVER (ORDER BY search_time DESC) AS row_number;
FROM
history_user
WHERE
user_id = 188
WHERE row_number>5
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
正确的语法如手册中所详述:
DELETE FROM history_user h
USING (
SELECT pk_id, row_number() OVER (ORDER BY search_time DESC) AS rn;
FROM history_user
WHERE user_id = 188
) sub
WHERE sub.rn > 5
AND h.pk_id = sub.pk_id;
Run Code Online (Sandbox Code Playgroud)
pk_id列的任何(组合)在哪里是唯一的.可能是user_id,search_time你的情况-或者,更方便,代理主键.
对于只是一个单一的 user_id,你可以简化为:
DELETE FROM history_user h
USING (
SELECT pk_id
FROM history_user
WHERE user_id = 188
ORDER BY search_time DESC
OFFSET 5
) sub
WHERE h.pk_id = sub.pk_id;
Run Code Online (Sandbox Code Playgroud)
另一方面,要一次处理多个用户,您需要添加PARTITION BY到您的窗口功能:
DELETE FROM history_user h
USING (
SELECT pk_id, row_number() OVER (PARTITION BY user_id
ORDER BY search_time DESC) AS rn;
FROM history_user
) sub
WHERE sub.rn > 5
AND h.pk_id = sub.pk_id;
Run Code Online (Sandbox Code Playgroud)