Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于id和另一个布尔列计数的SQL查询_Sql_Postgresql - Fatal编程技术网

基于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)