2016-05-14 43 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是一列的醜名,因爲它也是一個類型名。