首页 > 解决方案 > 基于大小写的 SQL 过滤器

问题描述

我有一张这样的桌子:

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

我似乎无法找出正确的方法来解决这个问题。

标签: sqlgroup-bycase

解决方案


您可以使用聚合:

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')

推荐阅读