我有一张表格
用户 ID | 活动 | 数 |
---|---|---|
1 | ev1 | 3 |
1 | ev3 | 6 |
2 | ev1 | 2 |
2 | ev2 | 1 |
2 | ev3 | 10 |
3 | ev4 | 4 |
我正在尝试查看是否有一种方法可以在单次查询中应用复杂的 AND 和 OR 过滤器来计算有多少 user_id 满足条件。
复合过滤器的示例如下(仅使用 OR 和 AND):
AND(OR(ev1 > 1, ev2 > 0), (ev3 > 5))
这意味着我想计算有多少用户拥有这些事件计数,运行此条件应该会产生 2 个用户:user_id=1 & user_id=2
我尝试按照以下方式将其写为 WHERE 子句:
SELECT count(user_id) from table
WHERE (
(
(event = 'ev1' AND count > 1)
OR
(event = 'ev2' AND count > 0)
)
AND
(
(event = 'ev3' AND count > 5)
)
)
我不知道如何正确编写 AND 部分,因为每当您包含 AND 检查时它都会返回 0 行,但是仅使用 OR 检查它就可以正确工作
听起来您需要一个带有条件计数的
HAVING
,而不是 WHERE
,并且您需要对其进行子查询,以便在计算剩余的总不同 user_id
之前可以按 user_id
执行此操作。
SELECT
COUNT(*)
FROM (
SELECT
t.user_id
FROM YourTable t
GROUP BY
t.user_id
HAVING COUNT(CASE WHEN
t.event = 'ev1' AND t.count > 1
OR
t.event = 'ev2' AND t.count > 0
THEN 1 END) > 0
)
AND
(
COUNT(CASE WHEN t.event = 'ev3' AND t.count > 5 THEN 1 END) > 0
)
) t;
想法是:
COUNT(CASE WHEN someCondition THEN 1 END) > 0
告诉您组中是否有任何行匹配该条件。因此,您可以在 HAVING
中组合多个计数来组成任意表达式。