我需要将用户的最后 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
我做错了什么?
最佳答案
正确的语法 as detailed in the manual :
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;
其中 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;
另一方面,要同时处理多个用户,您需要将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;
关于sql - 仅在表中保留用户的最后 5 个搜索结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26512509/