2017-02-23 95 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