2017-02-23 3 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 내가 match_ids을 반환 SQL 쿼리를 구성 할있다 기록했다 메시지가 동일한 경우에만 reply_batch = true이 두 개 미만인 경우에만 match_id

나는 분명히 충분히 쓸 수 있었으면 좋겠다.

message이 포함 된 각 행의 열은 reply_batch이며 true 또는 false로 설정됩니다. 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 

편집 :

다른 테이블의 certains 행을 삭제하는 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

관련 문제