2017-02-23 84 views
0

我有以下表格跟蹤的聊天消息記錄SQL查詢來算基於ID和另一個布爾列

CREATE TABLE public.perm_message_log 
(
    id bigint NOT NULL DEFAULT nextval('perm_message_log_id_seq'::regclass), 
    message text, 
    from_id text, 
    to_id text, 
    match_id text, 
    unix_timestamp bigint, 
    own_account boolean, 
    reply_batch boolean DEFAULT false, 
    insert_time timestamp with time zone DEFAULT now(), 
    account_id bigint, 
    match_pk bigint 
) 

每個對話具有相同的match_id我想構造一個SQL查詢將返回match_ids只有在少於兩個reply_batch = true的消息相同match_id

我希望我能夠以足夠清晰的方式編寫它。

包含message的每一行都有設置爲true或false的列reply_batch。我希望查詢返回reply_batch列中具有少於兩個「真」布爾值的所有match_id

編輯@TimBiegeleisen

謝謝您的回答,如果我是要刪除的行中的另一個表你的答案的回報?我想出了下面的查詢,但它是錯誤的。

delete from already_matched where already_matched.userid = (
WITH cte AS (
    SELECT match_id 
    FROM public.perm_message_log 
    GROUP BY match_id 
    HAVING SUM(CASE WHEN reply_batch THEN 1 ELSE 0 END) = 0 
) 
SELECT t1.from_id 
FROM public.perm_message_log t1 
INNER JOIN cte t2 
    ON t1.match_id = t2.match_id 
WHERE NOT t1.own_account) 

回答

1

您可以嘗試通過match_id聚集你的表,計算其reply_batch是爲match_id真正的次數。如果此計數小於2,則在結果集中保留match_id

WITH cte AS (
    SELECT match_id 
    FROM public.perm_message_log 
    GROUP BY match_id 
    HAVING SUM(CASE WHEN reply_batch THEN 1 ELSE 0 END) < 2 
) 
SELECT t1.match_id, 
     t1.from_id 
FROM public.perm_message_log t1 
INNER JOIN cte t2 
    ON t1.match_id = t2.match_id 
WHERE NOT t1.own_account 

編輯:

如果你想使用的CTE返回的一套match_id刪除另一個表中某些碼行,你可以試試:

DELETE 
FROM already_matched 
WHERE match_id IN (SELECT t.match_id FROM cte t) 
+0

感謝您的回答。我認爲最重要的部分是我所需要的。我不明白第二部分的目的是什麼 – Arya

+0

我假設你想返回匹配'match_id'值的實際記錄。如果沒有,那麼CTE一個人應該完成這項工作。 –

+0

謝謝,我其實想要更多的查詢,我現在試圖找出它 – Arya