本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
HAVING 子句
SELECT 中的 HAVING 子句指定了在组或聚合中应用的条件。换句话说,HAVING 会在应用 GROUP BY 子句的聚合后筛选行。由于 HAVING 是在 GROUP BY 之后进行评估的,因此它只能引用通过分组键、聚合表达式和常量构造(或派生)的表达式。(这些规则与适用于 GROUP BY 查询的 SELECT 子句中的表达式的规则相同。) HAVING 子句必须位于任何 GROUP BY 子句之后和任何 ORDER BY 子句之前。HAVING 就像WHERE 子句,但适用于群组。HAVING 子句的结果表示原始行的分组或聚合,而 WHERE 子句的结果是单个原始行。
在非流式应用程序中,如果没有 GROUP BY 子句,则假定 GROUP BY ()(但由于没有分组表达式,表达式只能由常量和聚合表达式组成)。在流式查询中,如果没有 GROUP BY 子句,就不能使用 HAVING。
WHERE 和 HAVING 都可以出现在单个 SELECT 语句中。WHERE 从流或表中选择满足其条件(Where-Condition)的单个行。GROUP BY 标准仅适用于由 WHERE 条件选择的行。
这样的分组,例如 “GROUP BY cCustomerID”,可以通过 Having-Condition 进一步限定,然后在指定分组中选择满足其条件的行的聚合。例如,“GROUP BY clientID HAVING SUM (ShipmentValue) > 3600” 将仅选择那些其各种发货量符合 WHERE 标准的值加起来也超过 3600 的客户。
有关条件,请参见 WHERE 子句语法表,该语法表适用于 HAVING 和 WHERE 子句。
条件必须是布尔谓词表达式。查询仅返回谓词为 TRUE 的行。
以下示例显示了一个流式查询,该查询显示了过去一小时内订单超过 1000 美元的产品。
SELECT STREAM "prodId" FROM "Orders" GROUP BY FLOOR("Orders".ROWTIME TO HOUR), "prodId" HAVING SUM("quantity" * "price") > 1000;