

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

# 单调表达式和运算符
<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 函数应用于升序的输入 {1.5、3、5、5.8、6.3} 时，会生成 {1、3、5、5、6}。请注意，输入是严格升序的，但输出只是升序的（包括重复值）。

## 推断单调性的规则
<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 相同，但不严格 | 
| \+ m | 与 m 相同 | 
| -m | 与 m 相反 | 
| m \+ c<br />c \+ m | 与 m 相同 | 
| m1 \+ m2 | 如果 m1 和 m2 的方向相同，则与 m1 相同；<br />否则不是单调的 | 
| c - m | 与 m 相反 | 
| m \* c<br />c \* m | 如果 c 为正数，则与 m 相同；<br />如果 c 为负数，则与 m 相反；如果 c 为 0，则是常数 (0) | 
| c / m | 如果 m 始终是正数或始终是负数，并且 c 和 m 的符号相同，则与 m 相同；<br />如果 m 始终是正数或始终是负数，并且 c 和 m 的符号不同，则与 m 相反；<br />否则不是单调的 | 
|   | 常量 | 
| [LOCALTIME](sql-reference-localtime.md)<br />[LOCALTIMESTAMP](sql-reference-local-timestamp.md)<br />[CURRENT\_ROW\_TIMESTAMP](sql-reference-current-row-timestamp.md)<br />[CURRENT\_DATE](sql-reference-current-date.md) |  升序 | 

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