繁体   English   中英

SQL 查询:第2个子句是否被第1个子句过滤?

[英]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 询问有关如何显示记录的选项

  • a) 在时间 x 和 y 之间进行冲刺
  • b) 有 2 个冲刺(但这 2 个冲刺不一定需要在 x 和 y 之间)

这里,需要在没有过滤条件的情况下应用条件。 因此,我们首先使用如下的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM