sql - 在 postgresql 的单个查询中使用 WITH + DELETE 子句

标签 sql postgresql common-table-expression dml

我有以下表结构,对于名为 listens 的表,PRIMARYKEY on (uid,timestamp)

     Column     |            Type             |                      Modifiers                       
----------------+-----------------------------+------------------------------------------------------    
 id             | integer                     | not null default nextval('listens_id_seq'::regclass)
 uid            | character varying           | not null
 date           | timestamp without time zone | 
 timestamp      | integer                     | not null
 artist_msid    | uuid                        | 
 album_msid     | uuid                        | 
 recording_msid | uuid                        | 
 json           | character varying           | 

我需要删除特定用户 (uid) 的所有条目,这些条目早于最大时间戳,比如 max 是 123456789(以秒为单位),delta 是 100000,那么,所有记录都更旧小于 ma​​x-100000

当表包含单个用户时,我设法创建了一个查询,但我无法制定它以适用于数据库中的每个用户。需要对数据库中的每个用户执行此操作。

WITH max_table as (
    SELECT max(timestamp) - 10000 as max 
    FROM listens 
    GROUP BY uid) 
DELETE FROM listens 
WHERE timestamp < (SELECT max FROM max_table);

有什么解决办法吗?

最佳答案

我想你所需要的就是使它成为一个相关的子查询:

WITH max_table as (
    SELECT uid, max(timestamp) - 10000 as mx
    FROM listens 
    GROUP BY uid
) 
DELETE FROM listens 
WHERE timestamp < (SELECT mx
                   FROM max_table 
                   where max_table.uid = listens.uid);

顺便说一句:timestamp 是一个糟糕的列名称,尤其是不包含时间戳值的列。一个原因是因为它也是一个关键字,但更重要的是它没有记录该列包含的内容。注册时间戳?过期时间戳?最后一个事件时间戳?

关于sql - 在 postgresql 的单个查询中使用 WITH + DELETE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37225041/

相关文章:

postgresql - 如何在 Postgresql 中创建多列 GiST 索引

sql - 如何包装以下 CTE,以便我可以将其输出与 INSERT INTO 语句一起使用?

sql - 从表中选择最新的 NOT NULL 值

Postgresql 递归 CTE 结果排序

sql - SQL 中的最佳 LIKE 搜索

c# - 使用 C# 问题在 Access 中附加和删除链接表

mysql - SQL Case 不标记 null 时

mysql - 通过数据透视表建立一对一关系

PostgreSQL "tuple already updated by self"

c# - 如何编写 T4 模板以从 Entity Framework 6 创建 DTO?