2016-05-14 44 views
0

DELETE子句在单个查询我有以下表结构,对于一个上(UID,时间戳)使用WITH + PostgreSQL中

 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   | 

我需要删除的所有条目命名​​用的PrimaryKey表特定用户(uid)它们比最大时间戳更早,例如max是123456789(以秒为单位),而增量为100000,则所有记录都早于max-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); 

任何解决方案?

+1

你想要涉及单个最大值还是每个用户的最大值?每个用户最多可以使用 – Mureinik

+0

。 –

回答

2

我认为你需要,是使这一合作相关子查询:

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); 

BTW:timestamp是一列一个可怕的名字,尤其是一个不包含时间戳值。一个原因是因为它也是一个关键字,但更重要的是它没有记录该列包含的内容。注册时间戳?到期时间戳?最后一个活动时间戳?

+0

'timestamp'包含正在插入的记录的监听时间戳(实际一个)。数据是每个用户的收听数据。 –

0

或者,你可以通过使用EXISTS避免MAX()()

DELETE FROM listens d 
WHERE EXISTS (
     SELECT * FROM listens x 
     WHERE x.uid = d.uid 
     AND x.timestamp >= d.timestamp + 10000 
     ); 

BTW:timestamp是一列的丑名,因为它也是一个类型名。