2017-02-23 39 views
0

я следующая таблица, которая отслеживает чат сообщения журналовSQL-запрос для подсчета на основе идентификатора и другую булевой колонку

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, имеет столбец reply_batch, который имеет значение true или false. Я хочу, чтобы запрос возвращал все match_id s, которые имеют менее двух «истинных» булевых значений для столбца reply_batch.

EDIT @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. Если этот счетчик меньше двух, сохраните этот 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 

Edit:

Если вы хотите использовать набор match_id возвращенное КТР для удаления certains строк в другой таблице, вы можете попробовать:

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

Спасибо за ответ , Я думаю, что верхняя часть делает то, что мне нужно. Я не понимаю, какова будет цель второй части. – Arya

+0

Я предположил, что вы хотите вернуть фактические записи, соответствующие совпадающим значениям 'match_id'. Если нет, то да, только CTE должен выполнить эту работу. –

+0

Спасибо, я действительно хочу больше из запроса, я пытаюсь понять это сейчас – Arya