[英]Short-circuit UNION? (only execute 2nd clause if 1st clause has no results)
[英]SQL Query: is 2nd clause filtered by 1st clause?
我有以下查询:
SELECT users.id FROM sprints INNER JOIN users on (sprints.user_id = users.id )
WHERE sprints.user_id IN (1,2,3)
AND sprints.created_at BETWEEN x AND y
GROUP BY users.id HAVING COUNT(sprints.id) > 2
HAVING COUNT(sprints.id) > 2
部分是指在 x 和 y 之间创建了>2 个冲刺吗? 或者它指的是一般只有 2 个冲刺(无论创建日期如何) ?
或者换句话说,查询的第二部分是否过滤为第一个查询的结果? 如果没有,我该怎么做?
GROUP BY 在对 WHERE 子句应用过滤器后进行评估。
因此在GROUP'ING的时候,过滤条件
WHERE sprints.user_id IN (1,2,3)
AND sprints.created_at BETWEEN x AND y
已经应用。
下一步是评估 HAVING 子句。
我们在此阶段获得了 GROUPED 记录集,之后应用了 HAVING 子句上的过滤器
HAVING COUNT(sprints.id)>2
编辑:从评论中,OP 询问有关如何显示记录的选项
这里,需要在没有过滤条件的情况下应用条件。 因此,我们首先使用如下的 case 表达式“有条件地”计数。
COUNT(CASE WHEN sprints.created_at BETWEEN x AND y THEN
1
END)
如果 sprints created_at date 位于 x 和 y 之间,则此计数表达式“计数”。 无论任何条件如何,COUNT(*) 列都会计数。
现在我们有了两个指标,我们过滤记录集,以满足
只带来我们有“x 和 y 时间之间的冲刺”和“有 2 个冲刺”的记录
WHERE cnt_of_sprints_between_x_and_y >0
AND cnt_of_sprints >0
最终查询
WITH DATA
AS (
SELECT users.id
,COUNT(CASE WHEN sprints.created_at BETWEEN x AND y THEN
1
END) as cnt_of_sprints_between_x_and_y
,COUNT(*) as cnt_of_sprints
FROM sprints
INNER JOIN users
ON (sprints.user_id = users.id )
WHERE sprints.user_id IN (1,2,3)
GROUP BY users.id
)
SELECT id
FROM data
WHERE cnt_of_sprints_between_x_and_y >0
AND cnt_of_sprints >0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.