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

标签 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

我做错了什么?

最佳答案

正确的语法 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_idsearch_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/

相关文章:

mysql - 有趣的 sql 查询(不在 select 中)

mysql - 相当于pgpool-II for MySQL

function - 作为 PostgreSQL 函数参数的表名

php - 多列而不是多行 - PDO 语句

python - 矩阵中的行相乘

mysql - 使用 'reservation' 分两步移动存储在数据库表中的信息资源

mysql - 查找以不同子字符串开头和结尾的字符串,然后插入到新列中

mysql - 优化代码以更快、更高效地运行

html - 在没有功能的sql查询中剥离图像标签

sql - 在不首先检索数组的情况下插入 PostgreSQL 数组