基于id和另一个布尔列计数的SQL查询
我有下表跟踪聊天信息日志基于id和另一个布尔列计数的SQL查询,sql,postgresql,Sql,Postgresql,我有下表跟踪聊天信息日志 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
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\u id
我想构造一个SQL查询,仅当具有相同match\u id的消息的reply\u batch=true
少于两个时,才会返回match\u id
我希望我能写得足够清楚
包含消息的每一行都有一列reply\u batch
,该列被设置为true或false。我希望查询返回reply\u batch
列中少于两个“true”布尔值的所有match\u id
s
编辑@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)
您可以尝试通过match\u id
聚合表,计算该match\u id
的reply\u batch
为真的次数。如果此计数小于2,则在结果集中保留该匹配\u 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
谢谢你的回答。我想上面的部分就是我需要的。我不明白第二部分的目的是什么,假设您想要返回与匹配的match\u id
值对应的实际记录。如果没有,那么是的,CTE本身就应该完成这项工作。谢谢,我确实希望从查询中获得更多信息,我现在正在努力弄清楚,在我们通过“CTE”查询获得所有match\u id
s之后,只有在“own\u account”为false的情况下,我们如何才能从每个匹配中获得from\u id
?
DELETE
FROM already_matched
WHERE match_id IN (SELECT t.match_id FROM cte t)