上下文:我在SQLFiddle Postgres 9.6 中摆弄 SQL 。我正在尝试将聚合函数应用于外部查询中的 2 列,这些列依赖于子查询中值的存在。
我很难使用 WHERE 子句而不是 HAVING 来确定查询是否正确。SQL 会执行,但我不确定它是否会生成预期的结果。
问题:有人可以帮助我理解这是否是执行聚合的正确方法吗?如果不是,如果user_id
在外部查询中包含 HAVING 需要 GROUPING BY这有点违背了目的,我该如何修改查询以获得预期的结果。
预期结果:我想计算用户在进行新操作之前执行的操作数。Read Article
如果用户 ( user_id
) 进入下一个操作 ( View Product
) 我只想计算事件的数量我将使用聚合来计算一些平均值。
询问:
SELECT event_type as action_a,
COUNT(event_type) as action_a_count,
COUNT(DISTINCT user_id) as unique_users
FROM events
WHERE event_type in ('Read Article')
AND user_id in
(
SELECT DISTINCT(user_id) as user_id
FROM events
WHERE event_type in ('View Product')
)
GROUP BY event_type
您的查询很好。与WHERE event_type = 'Read Article'
您过滤事件行。因此只有那些行必须被聚合。
您可以HAVING event_type = 'Read Article'
改为使用,因为您也按该列分组。这意味着您将首先查找所有行的用户,然后聚合所有所需的用户行,然后才消除不需要的 event_types。这会给 DBMS 带来更多的工作要做。
结论:用于WHERE
尽快减少行数,以便 DBMS 可以处理较小的数据集。这将加快您的查询。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句