

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 单调表达式和运算符
<a name="sql-reference-monotonic-expressions-operators"></a>

由于 Amazon Kinesis Data Analytics 查询对无限行流进行操作，因此只有在对这些流有所了解的情况下，才能进行某些操作。

例如，对于给定订单流，要求提供按日期和产品汇总订单的流是合理的（因为天数在增加），但要求提供按产品和发货状态汇总订单的流则不合理。我们永远无法完成通过小组件 X 发往俄勒冈州的汇总，因为我们永远看不到通过小组件发往俄勒冈州的“最后一个”订单。

这种按特定列或表达式排序的流的属性称为单调性。

一些与时间相关的定义：
+ **单调**。如果表达式是升序或降序的，则是单调的。等效的措辞是“不减少或不增加”。
+ **升序**。如果给定行的 e 值始终大于或等于前一行中的值，则表达式 e 在流中是升序的。
+ **降序**。如果给定行的 e 值始终小于或等于前一行中的值，则表达式 e 在流中是降序的。
+ **严格升序**。如果给定行的 e 值始终大于前一行中的值，则表达式 e 在流中是严格升序的。
+ **严格降序**。如果给定行的 e 值始终小于前一行中的值，则表达式 e 在流中是严格降序的。
+ **常量**。如果给定行的 e 值始终等于前一行中的值，则表达式 e 在流中是常量的。

请注意，根据这个定义，常量表达式被认为是单调的。

## 单调列
<a name="sql-reference-monotonic-expressions-columns"></a>

ROWTIME 系统列是升序的。ROWTIME 列不是严格升序的：连续行具有相同的时间戳是可以接受的。

Amazon Kinesis Data Analytics 可防止客户端在时间戳小于其写入流中的前一行的流中插入一行。Amazon Kinesis Data Analytics 还可确保，如果多个客户端在同一个流中插入行，则合并这些行，使得 ROWTIME 列是升序的。

例如，断言 orderId 列是升序的；或者排序顺序中没有 orderId 超过 100 行，显然是非常有用的。但是，当前版本不支持声明的排序键。

## 单调表达式
<a name="sql-reference-monotonic-expressions-expressions"></a>

如果 Amazon Kinesis Data Analytics 知道表达式的参数是单调的，就能推断出该表达式是单调的。（另请参阅[单调函数](sql-reference-monotonic.md)。）

另一个定义：

单调的函数或运算符

如果将函数或运算符应用于严格增加的值序列时，生成的结果序列是单调的，则该函数或运算符就是单调的。

例如，将 FLOOR 函数应用于升序的输入 \$11.5、3、5、5.8、6.3\$1 时，会生成 \$11、3、5、5、6\$1。请注意，输入是严格升序的，但输出只是升序的（包括重复值）。

## 推断单调性的规则
<a name="sql-reference-monotonic-rules"></a>

Amazon Kinesis Data Analytics 要求一个或多个分组表达式有效才能使流式 GROUP BY 语句有效。在其他情况下，如果 Amazon Kinesis Data Analytics 知道单调性，就能更高效地运行；例如，如果它知道某个特定键再也不会出现在流中，就能从窗口式聚合总数表中删除条目。

为了以这种方式利用单调性，Amazon Kinesis Data Analytics 使用了一套规则来推断表达式的单调性。下面是推断单调性的规则：


| Expression | 单调性 | 
| --- | --- | 
|  c  |  常量  | 
|  [FLOOR](sql-reference-floor.md)(m)  |  与 m 相同，但不严格  | 
|  [CEIL/CEILING](sql-reference-ceil.md)(m)  |  与 m 相同，但不严格  | 
|  [CEIL/CEILING](sql-reference-ceil.md)(m TO timeUnit)  |  与 m 相同，但不严格  | 
|  [FLOOR](sql-reference-floor.md)(m TO timeUnit)  |  与 m 相同，但不严格  | 
|  [SUBSTRING](sql-reference-substring.md)(m FROM 0 FOR c)  |  与 m 相同，但不严格  | 
|  \$1 m  |  与 m 相同  | 
|  -m  |  与 m 相反  | 
|  m \$1 c c \$1 m  |  与 m 相同  | 
|  m1 \$1 m2  |  如果 m1 和 m2 的方向相同，则与 m1 相同； 否则不是单调的  | 
|  c - m  |  与 m 相反  | 
|  m \$1 c c \$1 m  |  如果 c 为正数，则与 m 相同； 如果 c 为负数，则与 m 相反；如果 c 为 0，则是常数 (0)  | 
|  c / m  |  如果 m 始终是正数或始终是负数，并且 c 和 m 的符号相同，则与 m 相同； 如果 m 始终是正数或始终是负数，并且 c 和 m 的符号不同，则与 m 相反； 否则不是单调的  | 
|   |  常量  | 
|  [LOCALTIME](sql-reference-localtime.md) [LOCALTIMESTAMP](sql-reference-local-timestamp.md) [CURRENT\$1ROW\$1TIMESTAMP](sql-reference-current-row-timestamp.md) [CURRENT\$1DATE](sql-reference-current-date.md)  |   升序  | 

在整个表中，c 是一个常数，m（以及 m1 和 m2）是一个单调表达式。