SQL Фильтр на основе случая - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть такая таблица:

email | event

e1     a   
e1     c
e2     a
e3     b
e4     a
e4     b
e5     c
e6     d

Я пытаюсь создать запрос, который получает только те, у кого есть событие a исключительно

Желаемый вывод:

email  |  attended

e2       0

Вот мой SQL:

SELECT
    tm.email,
    MAX(
    CASE
    WHEN tm.event = 'b' or tm.event = 'c' THEN 1
    ELSE 0
    END)
    as attended,
FROM
    table.events as tm
WHERE
    tm.event IN ('a', 'b', 'c', 'd')
    AND attended = 0
GROUP BY
    tm.email, attended

Кажется, я не могу найти правильный путь к go по этому поводу.

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Вы можете использовать агрегацию:

select email
from events
group by email
having max(case when event = 'a' then 0 else 1 end) = 0

Или, если вы хотите получить все записи, вы можете выполнить фильтрацию с условием not exists:

select e.*
from events e
where 
    e.event = 'a'
    and not exists (select 1 from events e1 where e1.email = e.email and e1.event <> 'a')
0 голосов
/ 19 февраля 2020

Если вы хотите, чтобы письма имели только 'a', я бы использовал агрегацию, но вот так:

select email
from events
group by email
having min(event) = max(event) and min(event) = 'a';
...