在表格中仅保留用户的最后5个搜索结果

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)

我做错了什么?

Erw*_*ter 5

正确的语法如手册中所详述:

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)