Apache Calcite官方文档中文版- 进阶-3( 三 )


发出:
SELECT STREAM TUMBLE_END(rowtime, INTERVAL '1' HOUR) AS rowtime,productIdFROM OrdersGROUP BY TUMBLE(rowtime, INTERVAL '1' HOUR), productIdHAVING COUNT(*) > 2 OR SUM(units) > 10;rowtime | productId----------+-----------10:00:00 |3011:00:00 |10
3.11 子查询,视图和SQL闭包属性
前述的查询可以使用WHERE子查询中的子句来表示:
SELECT STREAM rowtime, productIdFROM (SELECT TUMBLE_END(rowtime, INTERVAL '1' HOUR) AS rowtime,productId,COUNT(*) AS c,SUM(units) AS suFROM OrdersGROUP BY TUMBLE(rowtime, INTERVAL '1' HOUR), productId)WHERE c > 2 OR su > 10;rowtime | productId----------+-----------10:00:00 |3011:00:00 |1011:00:00 |40
子句是在SQL早期引入的,当需要在聚合之后执行过滤器时,(回想一下,WHERE在输入到达GROUP BY子句之前过滤行) 。
从那时起,SQL已经成为一种数学封闭的语言,这意味着您可以在一个表上执行的任何操作也可以在查询上执行 。
SQL的闭包属性非常强大 。它不仅使陈旧过时(或至少减少到语法糖),它使视图成为可能:
CREATE VIEW HourlyOrderTotals (rowtime, productId, c, su) ASSELECT TUMBLE_END(rowtime, INTERVAL '1' HOUR),productId,COUNT(*),SUM(units)FROM OrdersGROUP BY TUMBLE(rowtime, INTERVAL '1' HOUR), productId;SELECT STREAM rowtime, productIdFROM HourlyOrderTotalsWHERE c > 2 OR su > 10;rowtime | productId----------+-----------10:00:00 |3011:00:00 |1011:00:00 |40
FROM子句中的子查询有时被称为“内联视图”,但实际上它们比视图更基础 。视图只是一个方便的方法,通过给出这些分片命名并将它们存储在元数据存储库中,将SQL分割成可管理的块 。
很多人发现嵌套的查询和视图在流上比在关系上更有用 。流式查询是连续运行的运算符的管道,而且这些管道通常会很长 。嵌套的查询和视图有助于表达和管理这些管道 。
顺便说一下,WITH子句可以完成与子查询或视图相同的操作:
WITH HourlyOrderTotals (rowtime, productId, c, su) AS (SELECT TUMBLE_END(rowtime, INTERVAL '1' HOUR),productId,COUNT(*),SUM(units)FROM OrdersGROUP BY TUMBLE(rowtime, INTERVAL '1' HOUR), productId)SELECT STREAM rowtime, productIdFROM HourlyOrderTotalsWHERE c > 2 OR su > 10;rowtime | productId------------+-----------10:00:00 |3011:00:00 |1011:00:00 |40
3.12 流和关系之间的转换
回顾一下视图的定义 。此视图是流还是关系?
它不包含关键字,所以它是一个关系 。但是,这是一种可以转换成流的关系 。
可以在关系和流式查询中使用它:
# A relation; will query the historic Orders table.# Returns the largest number of product #10 ever sold in one hour.SELECT max(su)FROM HourlyOrderTotalsWHERE productId = 10;# A stream; will query the Orders stream.# Returns every hour in which at least one product #10 was sold.SELECT STREAM rowtimeFROM HourlyOrderTotalsWHERE productId = 10;
这种方法不限于视图和子查询 。遵循CQL [1]中规定的方法,流式SQL中的每个查询都被定义为关系查询,并最上面的使用关键字转换为流 。
如果关键字存在于子查询或视图定义中,则不起作用 。
在查询准备时间,计算查询中引用的关系是否可以转换为流或历史的关系 。
有时候,一个流可以提供它的一些历史记录(比如 Kafka [2]主题中最后24小时的数据),但不是全部 。在运行时,计算出是否有足够的历史记录来运行查询,如果没有,则会给出错误 。

Apache Calcite官方文档中文版- 进阶-3

文章插图
3.13“饼图”问题:流上的关系查询
一个特定的情况下,需要将流转换为关系时会发生我所说的“饼图问题” 。想象一下,你需要写一个带有图表的网页,如下所示,它总结了每个产品在过去一小时内的订单数量 。