

要获得与亚马逊 Timestream 类似的功能 LiveAnalytics，可以考虑适用于 InfluxDB 的亚马逊 Timestream。适用于 InfluxDB 的 Amazon Timestream 提供简化的数据摄取和个位数毫秒级的查询响应时间，以实现实时分析。点击[此处](https://docs.aws.amazon.com//timestream/latest/developerguide/timestream-for-influxdb.html)了解更多信息。

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

# 查询语言参考
<a name="reference"></a>

**注意**  
本查询语言参考包括来自 [Trino Software Foundation](https://trino.io/foundation.html)（前身为 Presto Software Foundation）的以下第三方文档，该文档根据 Apache 许可证 2.0 版本获得许可。除非符合许可证要求，否则您可能不得使用本许可证。要获取 Apache 许可证 2.0 版本的副本，请访问 [Apache 网站](http://www.apache.org/licenses/LICENSE-2.0)。

Timestream for LiveAnalytics 支持一种用于处理数据的丰富查询语言。可在下方查看可用的数据类型、运算符、函数和构造。

您还可以立即在 [查询示例](sample-queries.md) 部分中开始使用 Timestream 的查询语言。

**Topics**
+ [支持的数据类型](supported-data-types.md)
+ [内置时间序列功能](timeseries-specific-constructs.md)
+ [SQL 支持](supported-sql-constructs.md)
+ [逻辑运算符](logical-operators.md)
+ [比较运算符](comparison-operators.md)
+ [比较函数](comparison-functions.md)
+ [条件表达式](conditional-expressions.md)
+ [转换函数](conversion-functions.md)
+ [数学运算](mathematical-operators.md)
+ [数学函数](mathematical-functions.md)
+ [字符串运算符](string-operators.md)
+ [字符串函数](string-functions.md)
+ [数组运算符](array-operators.md)
+ [数组函数](array-functions.md)
+ [按位函数](bitwise-functions.md)
+ [正则表达式函数](regex-functions.md)
+ [日期/时间运算符](date-time-operators.md)
+ [日期/时间函数](date-time-functions.md)
+ [聚合函数](aggregate-functions.md)
+ [窗口函数](window-functions.md)
+ [查询示例](sample-queries.md)

# 支持的数据类型
<a name="supported-data-types"></a>

Timestream LiveAnalytics 的查询语言支持以下数据类型。

**注意**  
[数据类型](https://docs.aws.amazon.com/timestream/latest/developerguide/writes.html#writes.data-types)中描述支持写入的数据类型。


| 数据类型 | 说明 | 
| --- | --- | 
|  `int`  |  表示 32 位整数。  | 
|  `bigint`  |  表示 64 位有符号整数。  | 
|  `boolean`  |  逻辑的两个真值其中之一，`True` 和 `False`。  | 
|  `double`  |  表示 64 位可变精度数据类型。实施 [IEEE 754 标准二进制浮点运算](https://standards.ieee.org/standard/754-2019.html)。  查询语言用于读取数据。针对 `Infinity` 和 `NaN` 双精度值，存在可在查询中使用的函数。但不能将这些值写入 Timestream。   | 
|  `varchar`  |  可变长度字符数据，最大大小为 2KB。  | 
|  `array[T,...]`  |  包含指定数据类型的一个或多个元素*T*，其中*T*可以是 Timestream 支持的任何数据类型。  | 
|   `row(T,...)`   |  包含一个或多个数据类型的命名字段*T*。这些字段可以是 Timestream 支持的任何数据类型，可使用点字段引用运算符进行访问： <pre>.</pre>  | 
|  `date`  |  表示表单中的日期`YYYY-MM-DD`。其中*YYYY*分别*MM*是年、*DD*月、日。支持的范围是从 `1970-01-01` 到 `2262-04-11`。  *示例*： <pre>1971-02-03</pre>  | 
|  `time`  |  表示 [UTC](https://en.wikipedia.org/wiki/Coordinated_Universal_Time) 中的时间。`time` 数据类型以 `HH.MM.SS.sssssssss.` 形式表示，支持纳秒级精度。  *示例*： <pre>17:02:07.496000000</pre>  | 
|  `timestamp`  |  表示时间实例，采用 UTC 时间的纳秒级精度。 `YYYY-MM-DD hh:mm:ss.sssssssss` 查询支持时间戳，范围为 `1677-09-21 00:12:44.000000000` 至 `2262-04-11 23:47:16.854775807`。  | 
|  `interval`  |  将时间间隔表示为字符串文字`Xt`，由两部分*X*和*t*组成。  *X*是大于或等于的数值`0`，并且*t*是时间单位，如秒或小时。单位不是复数形式。时间单位必须*t*是以下字符串字面量之一： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/timestream/latest/developerguide/supported-data-types.html)  *示例：* <pre>17s</pre> <pre>12second</pre> <pre>21hour</pre> <pre>2d</pre>  | 
|  `timeseries[row(timestamp, T,...)]`  |  表示在时间间隔内记录的度量值，以由 `row` 个对象组成的 `array` 表示。每个都`row`包含一个`timestamp`或多个数据类型的度量值*T*，其中*T*可以是`bigint`、`boolean``double`、或中的任何一个`varchar`。行按 `timestamp` 升序进行排列。*timeseries* 数据类型表示一段时间内的度量值。  | 
|  `unknown`  |  表示 null 数据。  | 

# 内置时间序列功能
<a name="timeseries-specific-constructs"></a>

Timestream for LiveAnalytics 提供了内置的时间序列功能，可将时间序列数据视为一流的概念。

内置的时间序列功能可分为两类：视图和函数。

可在下方阅读有关每个构造的说明。

**Topics**
+ [时间序列视图](timeseries-specific-constructs.views.md)
+ [时间序列函数](timeseries-specific-constructs.functions.md)

# 时间序列视图
<a name="timeseries-specific-constructs.views"></a>

Timestream for LiveAnalytics 支持以下用于将数据转换为`timeseries`数据类型的函数：

**Topics**
+ [CREATE\$1TIME\$1SERIES](#timeseries-specific-constructs.views.CREATE_TIME_SERIES)
+ [UNNEST](#timeseries-specific-constructs.views.UNNEST)

## CREATE\$1TIME\$1SERIES
<a name="timeseries-specific-constructs.views.CREATE_TIME_SERIES"></a>

 **CREATE\$1TIME\$1SERIES** 是一个聚合函数，接收时间序列的所有原始测量值（时间和度量值），并返回时间序列数据类型。此函数的语法如下：

```
CREATE_TIME_SERIES(time, measure_value::<data_type>)
```

 其中，`<data_type>` 是度量值的数据类型，可以是 bigint、boolean、double 或 varchar 其中之一。第二个参数不能为 null。

考虑存储在名为 **metrics** 的表中 EC2 实例的 CPU 利用率，如下所示：


| 时间 | region | az | vpc | instance\$1id | measure\$1name | measure\$1value::double | 
| --- | --- | --- | --- | --- | --- | --- | 
|  2019-12-04 19:00:00.000000000  |  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef0  |  cpu\$1utilization  |  35.0  | 
|  2019-12-04 19:00:01.000000000  |  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef0  |  cpu\$1utilization  |  38.2  | 
|  2019-12-04 19:00:02.000000000  |  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef0  |  cpu\$1utilization  |  45.3  | 
|  2019-12-04 19:00:00.000000000  |  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef1  |  cpu\$1utilization  |  54.1  | 
|  2019-12-04 19:00:01.000000000  |  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef1  |  cpu\$1utilization  |  42.5  | 
|  2019-12-04 19:00:02.000000000  |  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef1  |  cpu\$1utilization  |  33.7  | 

运行查询：

```
SELECT region, az, vpc, instance_id, CREATE_TIME_SERIES(time, measure_value::double) as cpu_utilization FROM metrics
    WHERE measure_name=’cpu_utilization’
    GROUP BY region, az, vpc, instance_id
```

将返回所有以 `cpu_utilization` 作为度量值的序列。本例中包含两个序列：


| region | az | vpc | instance\$1id | cpu\$1utilization | 
| --- | --- | --- | --- | --- | 
|  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef0  |  [\$1time: 2019-12-04 19:00:00.000000000, measure\$1value::double: 35.0\$1, \$1time: 2019-12-04 19:00:01.000000000, measure\$1value::double: 38.2\$1, \$1time: 2019-12-04 19:00:02.000000000, measure\$1value::double: 45.3\$1]  | 
|  us-east-1  |  us-east-1d  |  vpc-1a2b3c4d  |  i-1234567890abcdef1  |  [\$1time: 2019-12-04 19:00:00.000000000, measure\$1value::double: 35.1\$1, \$1time: 2019-12-04 19:00:01.000000000, measure\$1value::double: 38.5\$1, \$1time: 2019-12-04 19:00:02.000000000, measure\$1value::double: 45.7\$1]  | 

## UNNEST
<a name="timeseries-specific-constructs.views.UNNEST"></a>

 `UNNEST` 是表函数，可让您将 `timeseries` 数据转换为平面模型。语法如下：

 `UNNEST` 将 `timeseries` 转换为两列，即 `time` 和 `value`。也可以在 UNNEST 中使用别名，如下所示：

```
UNNEST(timeseries) AS <alias_name> (time_alias, value_alias)
```

其中 `<alias_name>` 是平面表的别名，`time_alias` 是 `time` 列的别名，`value_alias` 是 `value` 列的别名。

例如，假设实例集中的某些 EC2 实例配置为每 5 秒发送一次指标，其余实例则每 15 秒发送一次指标。此时您需要获取过去 6 小时内所有实例的平均指标数，且要求以 10 秒为粒度进行统计。要获取此数据，请使用 **CREATE\$1TIME\$1SERIES** 将指标转换为时间序列模型。然后，可使用 **INTERPOLATE\$1LINEAR**，并以 10 秒为粒度获取缺失值。下一步，使用 **UNNEST** 将数据转换回平面模型，然后使用 **AVG** 获取所有实例的平均指标数。

```
WITH interpolated_timeseries AS (
    SELECT region, az, vpc, instance_id,
        INTERPOLATE_LINEAR(
            CREATE_TIME_SERIES(time, measure_value::double),
                SEQUENCE(ago(6h), now(), 10s)) AS interpolated_cpu_utilization
    FROM timestreamdb.metrics 
    WHERE measure_name= ‘cpu_utilization’ AND time >= ago(6h)
    GROUP BY region, az, vpc, instance_id
)
SELECT region, az, vpc, instance_id, avg(t.cpu_util)
FROM interpolated_timeseries
CROSS JOIN UNNEST(interpolated_cpu_utilization) AS t (time, cpu_util)
GROUP BY region, az, vpc, instance_id
```

 上述查询演示如何使用带别名的 **UNNEST**。以下是相同查询的示例，但未使用 **UNNEST** 的别名：

```
WITH interpolated_timeseries AS (
    SELECT region, az, vpc, instance_id,
        INTERPOLATE_LINEAR(
            CREATE_TIME_SERIES(time, measure_value::double),
                SEQUENCE(ago(6h), now(), 10s)) AS interpolated_cpu_utilization
    FROM timestreamdb.metrics 
    WHERE measure_name= ‘cpu_utilization’ AND time >= ago(6h)
    GROUP BY region, az, vpc, instance_id
)
SELECT region, az, vpc, instance_id, avg(value)
FROM interpolated_timeseries
CROSS JOIN UNNEST(interpolated_cpu_utilization)
GROUP BY region, az, vpc, instance_id
```

# 时间序列函数
<a name="timeseries-specific-constructs.functions"></a>

Amazon Timestream for LiveAnalytics 支持时间序列函数，例如导数、积分和相关性以及其他函数，以便从您的时间序列数据中获得更深入的见解。本部分提供每个函数的用法说明及示例查询。选择以下主题以了解更多信息。

**Topics**
+ [插值函数](timeseries-specific-constructs.functions.interpolation.md)
+ [导数函数](timeseries-specific-constructs.functions.derivatives.md)
+ [积分函数](timeseries-specific-constructs.functions.integrals.md)
+ [相关性函数](timeseries-specific-constructs.functions.correlation.md)
+ [筛选和归约函数](timeseries-specific-constructs.functions.filter-reduce.md)

# 插值函数
<a name="timeseries-specific-constructs.functions.interpolation"></a>

如果时间序列数据在某些时间点存在事件缺失值，可通过插值法估计这些缺失事件的值。Amazon Timestream 支持四种插值变体：线性插值、三次样条插值、末次观测值结转（LOCF）插值以及常数插值。本节提供 LiveAnalytics插值函数的 Timestream 的用法信息以及示例查询。



## 使用情况信息
<a name="w2aab7c59c13c13c11b7"></a>


| 函数 | 输出数据类型 | 说明 | 
| --- | --- | --- | 
|  `interpolate_linear(timeseries, array[timestamp])`  |  时间序列  |  使用[线性插值](https://wikipedia.org/wiki/Linear_interpolation)填充缺失数据。  | 
|  `interpolate_linear(timeseries, timestamp)`  |  double  |  使用[线性插值](https://wikipedia.org/wiki/Linear_interpolation)填充缺失数据。  | 
|  `interpolate_spline_cubic(timeseries, array[timestamp])`  |  时间序列  |  使用[三次样条插值](https://wikiversity.org/wiki/Cubic_Spline_Interpolation#:~:text=Cubic%20spline%20interpolation%20is%20a,Lagrange%20polynomial%20and%20Newton%20polynomial.)填充缺失数据。  | 
|  `interpolate_spline_cubic(timeseries, timestamp)`  |  double  |  使用[三次样条插值](https://wikiversity.org/wiki/Cubic_Spline_Interpolation#:~:text=Cubic%20spline%20interpolation%20is%20a,Lagrange%20polynomial%20and%20Newton%20polynomial.)填充缺失数据。  | 
|  `interpolate_locf(timeseries, array[timestamp])`  |  时间序列  |  使用上次采样值填充缺失数据。  | 
|  `interpolate_locf(timeseries, timestamp)`  |  double  |  使用上次采样值填充缺失数据。  | 
|  `interpolate_fill(timeseries, array[timestamp], double)`  |  时间序列  |  使用常量值填充缺失数据。  | 
|  `interpolate_fill(timeseries, timestamp, double)`  |  double  |  使用常量值填充缺失数据。  | 

## 查询示例
<a name="w2aab7c59c13c13c11b9"></a>

**Example**  
计算过去 2 小时内特定 EC2 主机的 CPU 平均利用率，按 30 秒间隔进行分箱，并使用线性插值填补缺失值：  

```
WITH binned_timeseries AS (
SELECT hostname, BIN(time, 30s) AS binned_timestamp, ROUND(AVG(measure_value::double), 2) AS avg_cpu_utilization
FROM "sampleDB".DevOps
WHERE measure_name = 'cpu_utilization'
    AND hostname = 'host-Hovjv'
    AND time > ago(2h)
GROUP BY hostname, BIN(time, 30s)
), interpolated_timeseries AS (
SELECT hostname,
    INTERPOLATE_LINEAR(
        CREATE_TIME_SERIES(binned_timestamp, avg_cpu_utilization),
            SEQUENCE(min(binned_timestamp), max(binned_timestamp), 15s)) AS interpolated_avg_cpu_utilization
FROM binned_timeseries
GROUP BY hostname
)
SELECT time, ROUND(value, 2) AS interpolated_cpu
FROM interpolated_timeseries
CROSS JOIN UNNEST(interpolated_avg_cpu_utilization)
```

**Example**  
计算过去 2 小时内特定 EC2 主机的 CPU 平均利用率，按 30 秒间隔进行分箱，并使用基于末次观测值结转的插值填补缺失值：  

```
WITH binned_timeseries AS (
SELECT hostname, BIN(time, 30s) AS binned_timestamp, ROUND(AVG(measure_value::double), 2) AS avg_cpu_utilization
FROM "sampleDB".DevOps
WHERE measure_name = 'cpu_utilization'
    AND hostname = 'host-Hovjv'
    AND time > ago(2h)
GROUP BY hostname, BIN(time, 30s)
), interpolated_timeseries AS (
SELECT hostname,
    INTERPOLATE_LOCF(
        CREATE_TIME_SERIES(binned_timestamp, avg_cpu_utilization),
            SEQUENCE(min(binned_timestamp), max(binned_timestamp), 15s)) AS interpolated_avg_cpu_utilization
FROM binned_timeseries
GROUP BY hostname
)
SELECT time, ROUND(value, 2) AS interpolated_cpu
FROM interpolated_timeseries
CROSS JOIN UNNEST(interpolated_avg_cpu_utilization)
```

# 导数函数
<a name="timeseries-specific-constructs.functions.derivatives"></a>

导数用于计算特定指标的变化率，并可用于主动响应事件。例如，假设您计算过去 5 分钟内 EC2 实例 CPU 利用率的导数，并注意到出现明显的正导数。这可能表明对工作负载的需求有所增加，因此您可能需要启动更多的 EC2 实例，以更好地处理您的工作负载。

Amazon Timestream 支持两种导数函数的变体。本节提供 LiveAnalytics 导数函数的时间流的用法信息以及示例查询。



## 使用情况信息
<a name="w2aab7c59c13c13c13b9"></a>


| 函数 | 输出数据类型 | 说明 | 
| --- | --- | --- | 
|  `derivative_linear(timeseries, interval)`  |  时间序列  |  计算 `timeseries` 中每个点对指定 `interval` 的[导数](https://wikipedia.org/wiki/Derivative)。  | 
|  `non_negative_derivative_linear(timeseries, interval)`  |  时间序列  |  与 `derivative_linear(timeseries, interval)` 相同，但仅返回正值。  | 

## 查询示例
<a name="w2aab7c59c13c13c13c11"></a>

**Example**  
计算过去 1 小时内 CPU 利用率每 5 分钟的变化率：  

```
SELECT DERIVATIVE_LINEAR(CREATE_TIME_SERIES(time, measure_value::double), 5m) AS result 
FROM “sampleDB”.DevOps 
WHERE measure_name = 'cpu_utilization' 
AND hostname = 'host-Hovjv' and time > ago(1h) 
GROUP BY hostname, measure_name
```

**Example**  
计算由一个或多个微服务产生的错误增长率：  

```
WITH binned_view as (
    SELECT bin(time, 5m) as binned_timestamp, ROUND(AVG(measure_value::double), 2) as value            
    FROM “sampleDB”.DevOps  
    WHERE micro_service = 'jwt'  
    AND time > ago(1h) 
    AND measure_name = 'service_error'
    GROUP BY bin(time, 5m)
)
SELECT non_negative_derivative_linear(CREATE_TIME_SERIES(binned_timestamp, value), 1m) as rateOfErrorIncrease
FROM binned_view
```

# 积分函数
<a name="timeseries-specific-constructs.functions.integrals"></a>

您可以使用积分计算时间序列事件中单位时间内曲线下的面积。例如，假设您正在跟踪应用程序每单位时间接收到的请求量。在此场景中，您可以使用积分函数计算特定时间段内每指定间隔处理的请求总数。

Amazon Timestream 支持一种积分函数的变体。本节提供 LiveAnalytics 积分函数的 Timestream 的用法信息以及示例查询。



## 使用情况信息
<a name="w2aab7c59c13c13c15b9"></a>


| 函数 | 输出数据类型 | 说明 | 
| --- | --- | --- | 
|  `integral_trapezoidal(timeseries(double))` `integral_trapezoidal(timeseries(double), interval day to second)` `integral_trapezoidal(timeseries(bigint))` `integral_trapezoidal(timeseries(bigint), interval day to second)` `integral_trapezoidal(timeseries(integer), interval day to second)` `integral_trapezoidal(timeseries(integer))`  |  double  |  使用[梯形法则](https://wikipedia.org/wiki/Trapezoidal_rule),根据 `timeseries` 提供的指定 `interval day to second`，近似计算[积分](https://wikipedia.org/wiki/Integral)。天到秒间隔参数是可选的，默认值为 `1s`。有关间隔的更多信息，请参阅[间隔和持续时间](date-time-functions.md#date-time-functions-interval-duration)。  | 

## 查询示例
<a name="w2aab7c59c13c13c15c11"></a>

**Example**  
计算过去一小时内特定主机每五分钟处理的请求总量：  

```
SELECT INTEGRAL_TRAPEZOIDAL(CREATE_TIME_SERIES(time, measure_value::double), 5m) AS result FROM sample.DevOps 
WHERE measure_name = 'request' 
AND hostname = 'host-Hovjv' 
AND time > ago (1h) 
GROUP BY hostname, measure_name
```

# 相关性函数
<a name="timeseries-specific-constructs.functions.correlation"></a>

对于两个长度相近的时间序列，相关性函数可提供相关系数，该系数揭示两个时间序列随时间推移的趋势关系。相关系数的范围为 `-1.0` 到 `1.0`。`-1.0` 表示两个时间序列以相同速率呈相反方向变化。而 `1.0` 则表示两个时间序列以相同速率呈相同方向变化。值为 `0` 两个时间序列之间不存在相关性。例如，如果油价上涨，某石油公司的股价随之上涨，则油价上涨趋势与该石油公司股价上涨趋势之间将呈现正相关系数。高正相关系数表明两种价格以相似的速率变化。同样，债券价格与债券收益率之间的相关系数为负值，表明这两个值随时间推移呈现相反的趋势。

Amazon Timestream 支持两种相关性函数的变体。本节提供 LiveAnalytics 关联函数的时间流的用法信息以及示例查询。



## 使用情况信息
<a name="w2aab7c59c13c13c19c11"></a>


| 函数 | 输出数据类型 | 说明 | 
| --- | --- | --- | 
|  `correlate_pearson(timeseries, timeseries)`  |  double  |  计算两个 `timeseries` 的[皮尔逊相关系数](https://wikipedia.org/wiki/Pearson_correlation_coefficient)。时间序列必须具有相同的时间戳。  | 
|  `correlate_spearman(timeseries, timeseries)`  |  double  |  计算两个 `timeseries` 的[斯皮尔曼相关系数](https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient)。时间序列必须具有相同的时间戳。  | 

## 查询示例
<a name="w2aab7c59c13c13c19c13"></a>

**Example**  

```
WITH cte_1 AS (
    SELECT INTERPOLATE_LINEAR(
        CREATE_TIME_SERIES(time, measure_value::double), 
        SEQUENCE(min(time), max(time), 10m)) AS result 
    FROM sample.DevOps 
    WHERE measure_name = 'cpu_utilization' 
    AND hostname = 'host-Hovjv' AND time > ago(1h) 
    GROUP BY hostname, measure_name
), 
cte_2 AS (
    SELECT INTERPOLATE_LINEAR(
        CREATE_TIME_SERIES(time, measure_value::double), 
        SEQUENCE(min(time), max(time), 10m)) AS result 
    FROM sample.DevOps 
    WHERE measure_name = 'cpu_utilization' 
    AND hostname = 'host-Hovjv' AND time > ago(1h) 
    GROUP BY hostname, measure_name
) 
SELECT correlate_pearson(cte_1.result, cte_2.result) AS result 
FROM cte_1, cte_2
```

# 筛选和归约函数
<a name="timeseries-specific-constructs.functions.filter-reduce"></a>

Amazon Timestream 支持对时间序列数据执行筛选和归约操作的函数。本节提供 LiveAnalytics 筛选和缩减函数的时间流的用法信息，以及示例查询。



## 使用情况信息
<a name="w2aab7c59c13c13c23b7"></a>


| 函数 | 输出数据类型 | 说明 | 
| --- | --- | --- | 
|  `filter(timeseries(T), function(T, Boolean))`  |  timeseries(T)  |  根据输入的时间序列构造时间序列，其中使用的值是传递的 `function` 返回的 `true`。  | 
|  `reduce(timeseries(T), initialState S, inputFunction(S, T, S), outputFunction(S, R))`  |  R  |  返回从时间序列中减去的单个值。`inputFunction` 将按顺序对时间序列中的每个元素进行调用。除获取当前元素以外，inputFunction 还会获取当前状态（初始为 `initialState`）并返回新状态。将调用 `outputFunction`，以将最终状态转换为结果值。`outputFunction` 可以是恒等函数。  | 

## 查询示例
<a name="w2aab7c59c13c13c23b9"></a>

**Example**  
构造主机的 CPU 利用率时间序列，并筛选测量值大于 70 的数据点：  

```
WITH time_series_view AS (
    SELECT INTERPOLATE_LINEAR(
        CREATE_TIME_SERIES(time, ROUND(measure_value::double,2)), 
            SEQUENCE(ago(15m), ago(1m), 10s)) AS cpu_user
    FROM sample.DevOps
    WHERE hostname = 'host-Hovjv' and measure_name = 'cpu_utilization'
        AND time > ago(30m)
    GROUP BY hostname
)
SELECT FILTER(cpu_user, x -> x.value > 70.0) AS cpu_above_threshold
from time_series_view
```

**Example**  
构造主机的 CPU 利用率时间序列，并计算测量值的平方和：  

```
WITH time_series_view AS (
    SELECT INTERPOLATE_LINEAR(
        CREATE_TIME_SERIES(time, ROUND(measure_value::double,2)), 
            SEQUENCE(ago(15m), ago(1m), 10s)) AS cpu_user
    FROM sample.DevOps
    WHERE hostname = 'host-Hovjv' and measure_name = 'cpu_utilization'
        AND time > ago(30m)
    GROUP BY hostname
)
SELECT REDUCE(cpu_user,
    DOUBLE '0.0',
    (s, x) -> x.value * x.value + s,
    s -> s)
from time_series_view
```

**Example**  
构造主机的 CPU 利用率时间序列，并确定超过 CPU 阈值的样本所占比例：  

```
WITH time_series_view AS (
    SELECT INTERPOLATE_LINEAR(
        CREATE_TIME_SERIES(time, ROUND(measure_value::double,2)), 
            SEQUENCE(ago(15m), ago(1m), 10s)) AS cpu_user
    FROM sample.DevOps
    WHERE hostname = 'host-Hovjv' and measure_name = 'cpu_utilization'
        AND time > ago(30m)
    GROUP BY hostname
)
SELECT ROUND(
    REDUCE(cpu_user, 
      -- initial state 
      CAST(ROW(0, 0) AS ROW(count_high BIGINT, count_total BIGINT)),
      -- function to count the total points and points above a certain threshold
      (s, x) -> CAST(ROW(s.count_high + IF(x.value > 70.0, 1, 0), s.count_total + 1) AS ROW(count_high BIGINT, count_total BIGINT)),
      -- output function converting the counts to fraction above threshold
      s -> IF(s.count_total = 0, NULL, CAST(s.count_high AS DOUBLE) / s.count_total)), 
    4) AS fraction_cpu_above_threshold
from time_series_view
```

# SQL 支持
<a name="supported-sql-constructs"></a>

Timestream fo LiveAnalytics r 支持一些常见的 SQL 结构。可在下方阅读更多内容。

**Topics**
+ [SELECT](supported-sql-constructs.SELECT.md)
+ [子查询支持](supported-sql-constructs.subquery-support.md)
+ [SHOW 语句](supported-sql-constructs.SHOW.md)
+ [DESCRIBE 语句](supported-sql-constructs.DESCRIBE.md)
+ [UNLOAD](supported-sql-constructs.UNLOAD.md)

# SELECT
<a name="supported-sql-constructs.SELECT"></a>

**SELECT** 语句可用于从一个或多个表中检索数据。Timestream 的查询语言支持以下 **SELECT** 语句的语法：

```
[ WITH with_query [, ...] ]
            SELECT [ ALL | DISTINCT ] select_expr [, ...]
            [ function (expression) OVER (
            [ PARTITION BY partition_expr_list ]
            [ ORDER BY order_list ]
            [ frame_clause ] )
            [ FROM from_item [, ...] ]
            [ WHERE condition ]
            [ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ]
            [ HAVING condition]
            [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
            [ ORDER BY order_list ]
            [ LIMIT [ count | ALL ] ]
```

where 
+ `function (expression)` 是支持的[窗口函数](window-functions.md)之一。
+ `partition_expr_list` 为：

  ```
  expression | column_name [, expr_list ]
  ```
+ `order_list` 为：

  ```
  expression | column_name [ ASC | DESC ] 
  [ NULLS FIRST | NULLS LAST ]
  [, order_list ]
  ```
+ `frame_clause` 为：

  ```
  ROWS | RANGE
  { UNBOUNDED PRECEDING | expression PRECEDING | CURRENT ROW } |
  {BETWEEN
  { UNBOUNDED PRECEDING | expression { PRECEDING | FOLLOWING } |
  CURRENT ROW}
  AND
  { UNBOUNDED FOLLOWING | expression { PRECEDING | FOLLOWING } |
  CURRENT ROW }}
  ```
+ `from_item` 为以下之一：

  ```
  table_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
  from_item join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]
  ```
+ `join_type` 为以下之一：

  ```
  [ INNER ] JOIN
  LEFT [ OUTER ] JOIN
  RIGHT [ OUTER ] JOIN
  FULL [ OUTER ] JOIN
  ```
+ `grouping_element` 为以下之一：

  ```
  ()
  expression
  ```

# 子查询支持
<a name="supported-sql-constructs.subquery-support"></a>

 Timestream 支持 `EXISTS` 中的子查询和 `IN` 谓词。`EXISTS` 谓词用于判断子查询是否返回任何行。`IN` 谓词用于判断子查询生成的值是否与 IN 子句中的值或表达式匹配。Timestream 查询语言支持相关子查询及其他子查询。

```
SELECT t.c1
FROM (VALUES 1, 2, 3, 4, 5) AS t(c1)
WHERE EXISTS
(SELECT t.c2
 FROM (VALUES 1, 2, 3) AS t(c2)
 WHERE t.c1= t.c2
)
ORDER BY t.c1
```


| c1 | 
| --- | 
|  1  | 
|  2  | 
|  3  | 

```
SELECT t.c1
FROM (VALUES 1, 2, 3, 4, 5) AS t(c1)
WHERE t.c1 IN
(SELECT t.c2
 FROM (VALUES 2, 3, 4) AS t(c2)
)
ORDER BY t.c1
```


| c1 | 
| --- | 
|  2  | 
|  3  | 
|  4  | 

# SHOW 语句
<a name="supported-sql-constructs.SHOW"></a>

您可以使用 `SHOW DATABASES` 语句查看账户中的所有数据库。语法如下：

```
SHOW DATABASES [LIKE pattern]
```

其中，`LIKE` 子句可用于筛选数据库名称。

您可以使用 `SHOW TABLES` 语句查看账户中的所有表。语法如下：

```
SHOW TABLES [FROM database] [LIKE pattern]
```

其中，`FROM` 子句可用于筛选数据库名称，而 `LIKE` 子句可用于筛选表名。

您可以使用 `SHOW MEASURES` 语句查看表的所有度量。语法如下：

```
SHOW MEASURES FROM database.table [LIKE pattern]
```

其中，`FROM` 子句将用于指定数据库名称和表名称，而 `LIKE` 子句可用于筛选度量名称。

# DESCRIBE 语句
<a name="supported-sql-constructs.DESCRIBE"></a>

您可以使用 `DESCRIBE` 语句查看表的元数据。语法如下：

```
DESCRIBE database.table
```

其中，`table` 包含表名称。该 describe 语句返回表的列名和数据类型。

# UNLOAD
<a name="supported-sql-constructs.UNLOAD"></a>

Timestream for LiveAnalytics 支持将`UNLOAD`命令作为其 SQL 支持的扩展。[支持的数据类型](supported-data-types.md) 中描述 `UNLOAD` 支持的数据类型。`time` 和 `unknown` 类型不适用于 `UNLOAD`。

```
UNLOAD (SELECT statement)
 TO 's3://bucket-name/folder'
 WITH ( option = expression [, ...] )
```

其中选项为

```
{ partitioned_by = ARRAY[ col_name[,…] ] 
 | format = [ '{ CSV | PARQUET }' ] 
 | compression = [ '{ GZIP | NONE }' ]
 | encryption = [ '{ SSE_KMS | SSE_S3 }' ]
 | kms_key = '<string>'
 | field_delimiter ='<character>'
 | escaped_by = '<character>'
 | include_header = ['{true, false}']
 | max_file_size = '<value>'
}
```

SELECT 语句  
用于从一个或多个 Timestream 中为 LiveAnalytics 表选择和检索数据的查询语句。  

```
(SELECT column 1, column 2, column 3 from database.table
      where measure_name = "ABC" and timestamp between ago (1d) and now() )
```

TO 子句  

```
TO 's3://bucket-name/folder'
```
或者  

```
TO 's3://access-point-alias/folder'
```
`UNLOAD` 语句中的 `TO` 子句指定查询结果输出的目的地。您需要提供完整路径，包括 Amazon S3 存储桶名称或 Amazon S3，以及在 Amazon S3 access-point-alias 上 LiveAnalytics写入输出文件对象的 Timestream 上的文件夹位置。S3 存储桶应由同一账户拥有，且位于同一区域。除了查询结果集之外，Timestream 还会将清单和元数据文件 LiveAnalytics 写入指定的目标文件夹。

PARTITIONED\$1BY 子句  

```
partitioned_by = ARRAY [col_name[,…] , (default: none)
```
`partitioned_by` 子句用于在查询中按粒度级别对数据进行分组与分析。将查询结果导出至 S3 存储桶时，可以选择根据选择查询中的一个或多个列对数据进行分区。在对数据进行分区时，导出的数据会根据分区列划分为多个子集，每个子集存储在独立的文件夹中。在包含导出数据的结果文件夹中，将自动创建子文件夹 `folder/results/partition column = partition value/`。但请注意，分区列不会包含在输出文件中。  
`partitioned_by` 不是语法中的必选子句。如果选择不进行分区直接导出数据，可在语法中排除该子句。  

**Example**  
假设您正在监控网站的点击流数据，且有 5 个流量通道，即 `direct`、`Social Media`、`Organic Search`、`Other` 和 `Referral`。导出数据时，可选择使用列 `Channel` 对数据进行分区。在数据文件夹 `s3://bucketname/results` 中，您将包含五个分别以对应通道名称命名的文件夹，例如 `s3://bucketname/results/channel=Social Media/.`。在此文件夹中，您将找到所有通过 `Social Media` 通道访问您网站的客户数据。同样，您可为其余通道创建其他文件夹。
按通道列分区的导出数据  

![\[Folder structure showing channels: Direct, Organic search, Other, Referral, and Social media.\]](http://docs.aws.amazon.com/zh_cn/timestream/latest/developerguide/images/unload-results.png)


FORMAT  

```
format = [ '{ CSV | PARQUET }' , default: CSV
```
用于指定写入 S3 存储桶的查询结果格式的关键字。您可以使用逗号（,）作为默认分隔符，将数据导出为逗号分隔值（CSV）格式，也可以导出为 Apache Parquet 格式（一种用于分析的高效开放列式存储格式）。

COMPRESSION  

```
compression = [ '{ GZIP | NONE }' ], default: GZIP
```
您可以使用压缩算法 GZIP 对导出的数据进行压缩，也可以通过指定 `NONE` 选项将其解压缩。

ENCRYPTION  

```
encryption = [ '{ SSE_KMS | SSE_S3 }' ], default: SSE_S3
```
Amazon S3 上的输出文件会使用您选择的加密选项进行加密。除数据以外，清单文件和元数据文件也会根据您选择的加密选项进行加密。我们目前支持 SSE\$1S3 和 SSE\$1KMS 加密。SSE\$1S3 是一种服务器端加密，由 Amazon S3 使用 256 位高级加密标准（AES）加密对数据进行加密。SSE\$1KMS 是一种服务器端加密，用于使用客户托管的密钥对数据进行加密。

KMS\$1KEY  

```
kms_key = '<string>'
```
KMS 密钥是由客户定义的密钥，用于加密导出的查询结果。KMS 密钥由 AWS 密钥管理服务 (AWS KMS) 安全管理，用于加密 Amazon S3 上的数据文件。

FIELD\$1DELIMITER  

```
field_delimiter ='<character>' , default: (,)
```
以 CSV 格式导出数据时，此字段指定用于在输出文件中分隔字段的单个 ASCII 字符，如管道字符（\$1）、逗号（,）或制表符（/t）。CSV 文件的默认分隔符是逗号字符。如果数据中的某个值包含所选分隔符，则该分隔符将用引号字符进行引号处理。例如，如果数据中的值包含 `Time,stream`，则在导出数据中，该值将添加引号成为 `"Time,stream"`。Timestream 使用的引号字符 LiveAnalytics 是双引号 (“)。  
如果要在 CSV 中包含标题，请避免将回车符（ASCII 13、十六进制 `0D`、文本 '\$1r'）或换行符（ASCII 10、十六进制 0A、文本 '\$1n'）指定为 `FIELD_DELIMITER`，否则将导致多数解析器无法正确解析最终 CSV 输出中的标题。

ESCAPED\$1BY  

```
escaped_by = '<character>', default: (\)
```
以 CSV 格式导出数据时，此字段指定应在写入 S3 存储桶的数据文件中作为转义字符处理的字符。如果存在以下情形，可能会发生转义：  

1. 如果值本身包含引号字符（"），则将使用转义字符进行转义。例如，如果值为 `Time"stream`，其中（\$1）是已配置的转义字符，则将其转义为 `Time\"stream`。

1. 如果该值包含已配置的转义字符，则将对其进行转义。例如，如果值为 `Time\stream`，则将其转义为 `Time\\stream`。
如果导出的输出包含数组、行或时间序列等复杂数据类型，则会将其序列化为 JSON 字符串。以下为示例。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/timestream/latest/developerguide/supported-sql-constructs.UNLOAD.html)

INCLUDE\$1HEADER  

```
include_header = 'true' , default: 'false'
```
以 CSV 格式导出数据时，此字段允许您将列名作为导出 CSV 数据文件的首行。  
可接受的值为“true”和“false”，默认值为“false”。`escaped_by` 和 `field_delimiter` 等文本转换选项同样适用于标题。  
包含标题时，请避免使用回车符（ASCII 13、十六进制 0D、文本 '\$1r'）或换行符（ASCII 10、十六进制 0A、文本 '\$1n'）作为 `FIELD_DELIMITER`，否则将导致多数解析器无法正确解析最终 CSV 输出中的标题。

MAX\$1FILE\$1SIZE  

```
max_file_size = 'X[MB|GB]' , default: '78GB'
```
此字段指定 `UNLOAD` 语句在 Amazon S3 中创建的文件最大大小。`UNLOAD` 语句可创建多个文件，但写入 Amazon S3 的每个文件最大大小将大致等于此字段中指定的值。  
该字段的值必须在 16MB（含）和 78GB（含）之间。可以用整数（例如 `12GB`）或小数（例如 `0.5GB` 或 `24.7MB`）进行指定。默认值为 78 GB。  
写入文件时，实际文件大小是近似值，因此实际最大大小可能不完全等于您指定的数字。

# 逻辑运算符
<a name="logical-operators"></a>

Timestream fo LiveAnalytics r 支持以下逻辑运算符。


| 运算符 | 描述 | 示例 | 
| --- | --- | --- | 
|  AND  |  如果两个值都为 true，则返回 true  |  a AND b  | 
|  或  |  如果任一值为 true，则返回 true  |  a OR b  | 
|  NOT  |  如果值为 false，则返回 true。  |  NOT a  | 
+ 如果表达式的一侧或两侧均为 `NULL`，则 `AND` 的比较结果可能是 `NULL`。
+ 如果 `AND` 运算符的至少一侧为 `FALSE`，则表达式的计算结果为 `FALSE`。
+ 如果表达式的一侧或两侧均为 `NULL`，则 `OR` 的比较结果可能是 `NULL`。
+ 如果 `OR` 运算符的至少一侧为 `TRUE`，则表达式的计算结果为 `TRUE`。
+ `NULL` 的逻辑补语为 `NULL`。

以下真值表演示 `NULL` 在 `AND` 和 `OR` 中的处理方式：


| A | B | A and b | A or b | 
| --- | --- | --- | --- | 
|  null  |  null  |  null  |  null  | 
|  false   |  null  |  false  |  null  | 
|  null  |  false  |  false  |  null  | 
|  true  |  null  |  null  |  true  | 
|  null  |  true  |  null  |  true  | 
|  false  |  false  |  false  |  false  | 
|  true  |  false  |  false  |  true  | 
|  false  |  true  |  false  |  true  | 
|  true  |  true  |  true  |  true  | 

以下真值表演示 NULL 在 NOT 中的处理方式：


| A | Not a | 
| --- | --- | 
|  null  |  null  | 
|  true  |  false  | 
|  false  |  true  | 

# 比较运算符
<a name="comparison-operators"></a>

Timestream for LiveAnalytics 支持以下比较运算符。


| 运算符 | 说明 | 
| --- | --- | 
|  <  |  Less than  | 
|  >  |  Greater than  | 
|  <=  |  小于或等于  | 
|  >=  |  大于或等于  | 
|  =  |  Equal  | 
|  <>  |  Not equal  | 
|  \$1=  |  Not equal  | 

**注意**  
`BETWEEN` 运算符用于测试值是否在指定范围内。语法如下：  

  ```
  BETWEEN min AND max
  ```
`BETWEEN` 或 `NOT BETWEEN` 语句中出现 `NULL` 将导致该语句的计算结果为 `NULL`。
`IS NULL ` 和 `IS NOT NULL` 运算符用于测试值是否为 null（未定义）。`NULL` 与 `IS NULL` 结合使用的计算结果为 true。
在 SQL 中，`NULL` 值表示未知值。

# 比较函数
<a name="comparison-functions"></a>

的 Timestream LiveAnalytics 支持以下比较函数。

**Topics**
+ [greatest()](comparison-functions.greatest.md)
+ [least()](comparison-functions.least.md)
+ [ALL(), ANY() and SOME()](comparison-functions.all-any-some.md)

# greatest()
<a name="comparison-functions.greatest"></a>

**greatest()** 函数返回所提供值中的最大值。如果提供的值中有任何一个为 `NULL`，则返回 `NULL`。语法如下所示。

```
greatest(value1, value2, ..., valueN) 
```

# least()
<a name="comparison-functions.least"></a>

**least()** 函数返回所提供值中的最小值。如果提供的值中有任何一个为 `NULL`，则返回 `NULL`。语法如下所示。

```
least(value1, value2, ..., valueN) 
```

# ALL(), ANY() and SOME()
<a name="comparison-functions.all-any-some"></a>

`ALL`、`ANY` 和 `SOME` 量词可与比较运算符结合使用，具体方式如下。


| Expression | 含义 | 
| --- | --- | 
|  A = ALL(...)  |  当 A 等于所有值时，计算结果为 true。  | 
|  A <> ALL(...)  |  当 A 与任何值都不匹配时，计算结果为 true。  | 
|  A < ALL(...)  |  当 A 小于最小值时，计算结果为 true。  | 
|  A = ANY(...)  |  当 A 等于任何值时，计算结果为 true。  | 
|  A <> ANY(...)  |  当 A 与一个或多个值不匹配时，计算结果为 true。  | 
|  A < ANY(...)  |  当 A 小于最大值时，计算结果为 true。  | 

## 示例和使用说明
<a name="comparison-functions.all-any-some.examples-usage"></a>

**注意**  
使用 `ALL`、`ANY` 或 `SOME` 时，如果比较值是字面值列表，则应使用关键字 `VALUES`。

## 示例：`ANY()`
<a name="w2aab7c59c21c11c11"></a>

查询语句中 `ANY()` 的示例如下。

```
SELECT 11.7 = ANY (VALUES 12.0, 13.5, 11.7)
```

同一操作的替代语法如下所示。

```
SELECT 11.7 = ANY (SELECT 12.0 UNION ALL SELECT 13.5 UNION ALL SELECT 11.7)
```

在本例中，`ANY()` 计算结果为 `True`。

## 示例：`ALL()`
<a name="w2aab7c59c21c11c13"></a>

查询语句中 `ALL()` 的示例如下。

```
SELECT 17 < ALL (VALUES 19, 20, 15);
```

同一操作的替代语法如下所示。

```
SELECT 17 < ALL (SELECT 19 UNION ALL SELECT 20 UNION ALL SELECT 15);
```

在本例中，`ALL()` 计算结果为 `False`。

## 示例：`SOME()`
<a name="w2aab7c59c21c11c15"></a>

查询语句中 `SOME()` 的示例如下。

```
SELECT 50 >= SOME (VALUES 53, 77, 27);
```

同一操作的替代语法如下所示。

```
SELECT 50 >= SOME (SELECT 53 UNION ALL SELECT 77 UNION ALL SELECT 27);
```

在本例中，`SOME()` 计算结果为 `True`。

# 条件表达式
<a name="conditional-expressions"></a>

Timestream LiveAnalytics 支持以下条件表达式。

**Topics**
+ [CASE 语句](conditional-expressions.CASE.md)
+ [IF 语句](conditional-expressions.IF.md)
+ [COALESCE 语句](conditional-expressions.COALESCE.md)
+ [NULLIF 语句](conditional-expressions.NULLIF.md)
+ [TRY 语句](conditional-expressions.TRY.md)

# CASE 语句
<a name="conditional-expressions.CASE"></a>

**CASE** 语句从左到右搜索每个值表达式，直至找到与 `expression` 相等的表达式。如果找到匹配项，则返回匹配值的结果。如果未找到匹配项，则返回 `ELSE` 子句的结果（如果存在）；否则返回 `null`。语法如下：

```
CASE expression
    WHEN value THEN result
    [ WHEN ... ]
    [ ELSE result ]
END
```

 Timestream 还支持 **CASE** 语句的以下语法。在此语法中，“searched”形式会从左至右评估每个布尔条件，直至遇到条件为 `true` 的情况，并返回匹配结果。如果没有条件为 `true`，则返回 `ELSE` 子句的结果（如果存在）；否则返回 `null`。另请参阅以下替代语法：

```
CASE
    WHEN condition THEN result
    [ WHEN ... ]
    [ ELSE result ]
END
```

# IF 语句
<a name="conditional-expressions.IF"></a>

**IF** 语句评估条件为真或假，并返回相应的值。Timestream 支持 **IF** 的以下两种语法表示形式：

```
if(condition, true_value)
```

如果条件为 `true`，则此语法计算并返回 `true_value`；否则返回 `null`，且不计算 `true_value`。

```
if(condition, true_value, false_value)
```

如果条件为 `true`，则此语法计算并返回 `true_value`，否则计算并返回 `false_value`。

## 示例
<a name="conditional-expressions.IF.examples"></a>

```
SELECT
  if(true, 'example 1'),
  if(false, 'example 2'),
  if(true, 'example 3 true', 'example 3 false'),
  if(false, 'example 4 true', 'example 4 false')
```


| \$1col0 | \$1col1 | \$1col2 | \$1col3 | 
| --- | --- | --- | --- | 
|  `example 1`  |  `-` `null`  |  `example 3 true`  |  `example 4 false`  | 

# COALESCE 语句
<a name="conditional-expressions.COALESCE"></a>

 **COALESCE** 返回参数列表中第一个非 null 值。语法如下：

```
coalesce(value1, value2[,...])
```

# NULLIF 语句
<a name="conditional-expressions.NULLIF"></a>

**IF** 语句评估条件为真或假，并返回相应的值。Timestream 支持 **IF** 的以下两种语法表示形式：

如果 `value1` 等于 `value2`，**NULLIF** 返回 null；否则返回 `value1` 语法如下：

```
nullif(value1, value2)
```

# TRY 语句
<a name="conditional-expressions.TRY"></a>

**TRY** 函数计算表达式并通过返回 `null`，以处理某些类型的错误。语法如下：

```
try(expression)
```

# 转换函数
<a name="conversion-functions"></a>

Timestream LiveAnalytics 支持以下转换函数。

**Topics**
+ [cast()](#conversion-functions.cast)
+ [try\$1cast()](#conversion-functions.try-cast)

## cast()
<a name="conversion-functions.cast"></a>

 显式将值转换为特定类型的 cast 函数语法如下。

```
cast(value AS type)
```

## try\$1cast()
<a name="conversion-functions.try-cast"></a>

Timestream LiveAnalytics 还支持 try\$1cast 函数，该函数与强制转换类似，但如果强制转换失败则返回 null。语法如下所示。

```
try_cast(value AS type)
```

# 数学运算
<a name="mathematical-operators"></a>

Timestream fo LiveAnalytics r 支持以下数学运算符。


| 运算符 | 说明 | 
| --- | --- | 
|  \$1  |  加  | 
|  -  |  减  | 
|  \$1  |  乘  | 
|  /  |  除法（整数除法执行截断）  | 
|  %  |  模（余数）  | 

# 数学函数
<a name="mathematical-functions"></a>

Timestream LiveAnalytics 支持以下数学函数。


| 函数 | 输出数据类型 | 说明 | 
| --- | --- | --- | 
|  abs(x)  |  [与输入相同]  |  返回 x 的绝对值。  | 
|  cbrt(x)  |  double  |  返回 x 的立方根。  | 
|  ceiling(x) or ceil(x)  |  [与输入相同]  |  返回向上取整到最接近整数的 x 值。  | 
|  degrees(x)  |  double  |  将以弧度为单位的角度 x 转换为度。  | 
|  e()  |  double  |  返回常量欧拉数。  | 
|  exp(x)  |  double  |  返回欧拉数的 x 次方。  | 
|  floor(x)  |  [与输入相同]  |  返回向下取整到最接近整数的 x 值。  | 
|  from\$1base(string,radix)  |  bigint  |  返回字符串作为基数解释后的值。  | 
|  ln(x)  |  double  |  返回 x 的自然对数。  | 
|  log2(x)  |  double  |  返回 x 的以 2 为底的对数。  | 
|  log10(x)  |  double  |  返回 x 的以 10 为底的对数。  | 
|  mod(n,m)   |  [与输入相同]  |  返回 n 除以 m 的模（余数）。  | 
|  pi()   |  double  |  返回常量 Pi。  | 
|  pow(x, p) or power(x, p)  |  double  |  返回 x 的 p 次方。  | 
|  radians(x)  |  double  |  将以度为单位的角度 x 转换为弧度。  | 
|  rand() or random()  |  double  |  返回在 0.0 到 1.0 范围内的伪随机值。  | 
|  random(n)  |  [与输入相同]  |  返回 0 到 n（不含）范围内的伪随机值。  | 
|  round(x)  |  [与输入相同]  |  返回四舍五入到最接近整数的 x 值。  | 
|  round(x,d)  |  [与输入相同]  |  返回四舍五入到小数点后 d 位的 x。  | 
|  sign(x)  |  [与输入相同]  |  返回 x 的符号函数，即： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/timestream/latest/developerguide/mathematical-functions.html) 对于双精度参数，该函数还会返回： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/timestream/latest/developerguide/mathematical-functions.html)  | 
|  sqrt(x)   |  double  |  返回 x 的平方根。  | 
|  to\$1base(x, radix)   |  varchar  |  返回 x 的基数表示形式。  | 
|  truncate(x)   |  double  |  通过去掉小数点后的数字，将 x 四舍五入为整数。  | 
|  acos(x)  |  double  |  返回 x 的反余弦值。  | 
|  asin(x)   |  double  |  返回 x 的反正弦值。  | 
|  atan(x)   |  double  |  返回 x 的反正切值。  | 
|  atan2(y, x)  |  double  |  返回 y/x 的反正切值。  | 
|  cos(x)  |  double  |  返回 x 的余弦值。  | 
|  cosh(x)  |  double  |  返回 x 的双曲余弦值。  | 
|  sin(x)   |  double  |  返回 x 的正弦值。  | 
|  tan(x)  |  double  |  返回 x 的正切值。  | 
|  tanh(x)  |  double  |  返回 x 的双曲正切值。  | 
|  infinity()  |  double  |  返回表示正无穷大的常数。  | 
|  is\$1finite(x)  |  布尔值  |  判断 x 是否为有限数。  | 
|  is\$1infinite(x)  |  布尔值  |  判断 x 是否为无穷大。  | 
|  is\$1nan(x)  |  布尔值  |  确定 x 是否为 not-a-number。  | 
|  nan()  |  double  |  返回表示的常量 not-a-number。  | 

# 字符串运算符
<a name="string-operators"></a>

Timestream for LiveAnalytics 支持用于连接一个或多个字符串的`||`运算符。

# 字符串函数
<a name="string-functions"></a>

**注意**  
除非另有说明，否则这些函数的输入数据类型默认为 varchar。


| 函数 | 输出数据类型 | 说明 | 
| --- | --- | --- | 
|  chr(n)   |  varchar  |  以 varchar 形式返回 Unicode 码点 n。  | 
|  codepoint(x)   |  整数  |  返回 str 中唯一字符的 Unicode 码点。  | 
|  concat(x1, ..., xN)  |  varchar  |  返回 x1、x2、...、xN 的串联结果。  | 
|  hamming\$1distance(x1,x2)   |  bigint  |  返回 x1 和 x2 的汉明距离，即对应字符不同的位置数量。请注意，两个 varchar 输入必须具有相同的长度。  | 
|  length(x)  |  bigint  |  返回 x 的长度（以字符为单位）。  | 
|  levenshtein\$1distance(x1, x2)   |  bigint  |  返回 x1 和 x2 之间的 Levenshtein 编辑距离，即将 x1 变为 x2 所需的最小单字符编辑次数（插入、删除或替换）。  | 
|  lower(x)  |  varchar  |  将 x 转换为小写形式。  | 
|  lpad(x1, bigint size, x2)  |  varchar  |  左侧填充 x1，以使字符与 x2 对齐。如果 size 小于 x1 的长度，则结果被截断为 size 字符。size 不得为负数，x2 必须为非空。  | 
|  ltrim(x)  |  varchar  |  移除 x 中的前导空格。  | 
|  replace(x1, x2)  |  varchar  |  从 x1 中移除 x2 的所有实例。  | 
|  replace(x1, x2, x3)  |  varchar  |  将 x2 的所有实例替换为 x1 中的 x3。  | 
|  Reverse(x)   |  varchar  |  返回 x，其中字符按反向顺序排列。  | 
|  rpad(x1, bigint size, x2)  |  varchar  |  右侧填充 x1，以使字符与 x2 对齐。如果 size 小于 x1 的长度，则结果被截断为 size 字符。size 不得为负数，x2 必须为非空。  | 
|  rtrim(x)  |  varchar  |  移除 x 的尾随空格。  | 
|  split(x1, x2)  |  array(varchar)  |  在分隔符 x2 处拆分 x1，并返回数组。  | 
|  split(x1, x2, bigint limit)  |  array(varchar)  |  在分隔符 x2 处拆分 x1，并返回数组。数组中最后一个元素始终包含 x1 中剩余的所有内容。limit 必须为正数。  | 
|  split\$1part(x1, x2, bigint pos)   |  varchar  |  在分隔符 x2 处拆分 x1，并返回 pos 位置处的 varchar 字段。字段索引从 1 开始。如果 pos 大于字段数，则返回 null。  | 
|  strpos(x1, x2)   |  bigint  |  返回 x1 中 x2 的第一个实例的起始位置。位置从 1 开始。如果未找到，则返回 0。  | 
|  strpos(x1, x2,bigint instance)   |  bigint  |  返回 x1 中 x2 的第 N 个实例的位置。instance 必须为正数。位置从 1 开始。如果未找到，则返回 0。  | 
|  strrpos(x1, x2)   |  bigint  |  返回 x1 中 x2 的最后一个实例的起始位置。位置从 1 开始。如果未找到，则返回 0。  | 
|  strrpos(x1, x2, bigint instance)   |  bigint  |  返回 x1 中 x2 的第 N 个实例的位置，从 x1 的末尾开始计数。instance 必须为正数。位置从 1 开始。如果未找到，则返回 0。  | 
|  position(x2 IN x1)   |  bigint  |  返回 x1 中 x2 的第一个实例的起始位置。位置从 1 开始。如果未找到，则返回 0。  | 
|  substr(x, bigint start)   |  varchar  |  返回从起始位置 start 开始的 x 其余部分。位置从 1 开始。负起始位置解释为相对于 x 的末尾。  | 
|  substr(x, bigint start, bigint len)   |  varchar  |  从起始位置 start 返回长度为 len 的 x 的子字符串。位置从 1 开始。负起始位置解释为相对于 x 的末尾。  | 
|  trim(x)   |  varchar  |  从 x 中删除前导和尾随空格。  | 
|  upper(x)   |  varchar  |  将 x 转换为大写形式  | 

# 数组运算符
<a name="array-operators"></a>

的 Timestream LiveAnalytics 支持以下数组运算符。


| 运算符 | 说明 | 
| --- | --- | 
|  []  |  访问数组元素时，其起始索引从 1 开始。  | 
|  \$1\$1  |  将数组与另一个数组或相同类型的元素进行连接。  | 

# 数组函数
<a name="array-functions"></a>

的 Timestream LiveAnalytics 支持以下数组函数。


| 函数 | 输出数据类型 | 说明 | 
| --- | --- | --- | 
|  array\$1distinct(x)  |  array  |  从数组 x 中删除重复值。 <pre>SELECT array_distinct(ARRAY[1,2,2,3])</pre> 示例结果：`[ 1,2,3 ]`  | 
|  array\$1intersect(x, y)  |  array  |  返回包含 x 和 y 交集元素的数组，且不含重复项。 <pre>SELECT array_intersect(ARRAY[1,2,3], ARRAY[3,4,5])</pre> 示例结果：`[ 3 ]`  | 
|  array\$1union(x, y)  |  array  |  返回包含 x 和 y 并集元素的数组，且不含重复项。 <pre>SELECT array_union(ARRAY[1,2,3], ARRAY[3,4,5])</pre> 示例结果：`[ 1,2,3,4,5 ]`  | 
|  array\$1except(x, y)  |  array  |  返回数组，包含 x 中的元素，但不包含 y 中的元素，且不包含重复项。 <pre>SELECT array_except(ARRAY[1,2,3], ARRAY[3,4,5])</pre> 示例结果：`[ 1,2 ]`  | 
|  array\$1join(x, delimiter, null\$1replacement)   |  varchar  |  使用分隔符和可选字符串连接给定数组的元素以替换 null 值。 <pre>SELECT array_join(ARRAY[1,2,3], ';', '')</pre> 示例结果：`1;2;3`  | 
|  array\$1max(x)  |  与数组元素相同  |  返回输入数组中的最大值。 <pre>SELECT array_max(ARRAY[1,2,3])</pre> 示例结果：`3`  | 
|  array\$1min(x)  |  与数组元素相同  |  返回输入数组中的最小值。 <pre>SELECT array_min(ARRAY[1,2,3])</pre> 示例结果：`1`  | 
|  array\$1position(x, element)  |  bigint  |  返回元素在数组 x 中首次出现的位置（如果未找到，则返回 0）。 <pre>SELECT array_position(ARRAY[3,4,5,9], 5)</pre> 示例结果：`3`  | 
|  array\$1remove(x, element)  |  array  |  从数组 x 中移除所有等于元素的元素。 <pre>SELECT array_remove(ARRAY[3,4,5,9], 4)</pre> 示例结果：`[ 3,5,9 ]`  | 
|  array\$1sort(x)  |  array  |  对数组 x 进行排序并返回。x 的元素必须可排序。Null 元素将放置在返回数组的末尾。 <pre>SELECT array_sort(ARRAY[6,8,2,9,3])</pre> 示例结果：`[ 2,3,6,8,9 ]`  | 
|  arrays\$1overlap(x, y)   |  布尔值  |  测试数组 x 和 y 是否有共同的非 null 元素。如果没有共同的非 null 元素，但任何一个数组包含 null 值，则返回 null。 <pre>SELECT arrays_overlap(ARRAY[6,8,2,9,3], ARRAY[6,8])</pre> 示例结果：`true`  | 
|  cardinality(x)  |  bigint  |  返回数组 x 的大小。 <pre>SELECT cardinality(ARRAY[6,8,2,9,3])</pre> 示例结果：`5`  | 
|  concat(array1, array2, ..., arrayN)  |  array  |  连接数组 array1、array2、...、arrayN。 <pre>SELECT concat(ARRAY[6,8,2,9,3], ARRAY[11,32], ARRAY[6,8,2,0,14])</pre> 示例结果：`[ 6,8,2,9,3,11,32,6,8,2,0,14 ]`  | 
|  element\$1at(array(E), index)  |  E  |  返回数组中指定索引处的元素。如果索引 < 0，则 element\$1at 从最后一个元素开始访问直至第一个元素。 <pre>SELECT element_at(ARRAY[6,8,2,9,3], 1)</pre> 示例结果：`6`  | 
|  repeat(element, count)   |  array  |  重复元素计数次数。 <pre>SELECT repeat(1, 3)</pre> 示例结果：`[ 1,1,1 ]`  | 
|  reverse(x)  |  array  |  返回一个数组，其顺序与数组 x 的顺序相反。 <pre>SELECT reverse(ARRAY[6,8,2,9,3])</pre> 示例结果：`[ 3,9,2,8,6 ]`  | 
|  sequence(start, stop)  |  array(bigint)  |  生成从 start 到 stop 的整数序列，如果 start 小于或等于 stop，则以 1 为增量，否则以 -1 为增量。 <pre>SELECT sequence(3, 8)</pre> 示例结果：`[ 3,4,5,6,7,8 ]`  | 
|  sequence(start, stop, step)   |  array(bigint)  |  生成从 start 到 stop 的整数序列，以 step 为增量。 <pre>SELECT sequence(3, 15, 2)</pre> 示例结果：`[ 3,5,7,9,11,13,15 ]`  | 
|  sequence(start, stop)   |  array(timestamp)  |  生成从 start date 到 stop date 的时间戳序列，以 1 天为增量。 <pre>SELECT sequence('2023-04-02 19:26:12.941000000', '2023-04-06 19:26:12.941000000', 1d)</pre> 示例结果：`[ 2023-04-02 19:26:12.941000000,2023-04-03 19:26:12.941000000,2023-04-04 19:26:12.941000000,2023-04-05 19:26:12.941000000,2023-04-06 19:26:12.941000000 ]`  | 
|  sequence(start, stop, step)   |  array(timestamp)  |  生成从 start 到 stop 的时间戳序列，以 step 为增量。step 的数据类型是间隔。 <pre>SELECT sequence('2023-04-02 19:26:12.941000000', '2023-04-10 19:26:12.941000000', 2d)</pre> 示例结果：`[ 2023-04-02 19:26:12.941000000,2023-04-04 19:26:12.941000000,2023-04-06 19:26:12.941000000,2023-04-08 19:26:12.941000000,2023-04-10 19:26:12.941000000 ]`  | 
|  shuffle(x)  |  array  |  生成给定数组 x 的随机排列。 <pre>SELECT shuffle(ARRAY[6,8,2,9,3])</pre> 示例结果：`[ 6,3,2,9,8 ]`  | 
|  slice(x, start, length)  |  array  |  子集数组 x 从索引开头开始（如果起始为负数，则从末尾开始），长度为 length。 <pre>SELECT slice(ARRAY[6,8,2,9,3], 1, 3)</pre> 示例结果：`[ 6,8,2 ]`  | 
|  zip(array1, array2[, ...])  |  array(row)  |  按元素将给定数组合并为单个行数组。如果参数长度不一致，则用 NULL 填充缺失值。 <pre>SELECT zip(ARRAY[6,8,2,9,3], ARRAY[15,24])</pre> 示例结果：`[ ( 6, 15 ),( 8, 24 ),( 2, - ),( 9, - ),( 3, - ) ]`  | 

# 按位函数
<a name="bitwise-functions"></a>

的 Timestream LiveAnalytics 支持以下按位函数。


| 函数 | 输出数据类型 | 说明 | 
| --- | --- | --- | 
| bit\$1count(bigint, bigint) | bigint（二进制补码） |  返回第一个 bigint 参数中位数的计数，其中第二个参数是有符号的位整数，例如 8 或 64。 <pre>SELECT bit_count(19, 8)</pre> 示例结果：`3` <pre>SELECT bit_count(19, 2)</pre> 示例结果：`Number must be representable with the bits specified. 19 can not be represented with 2 bits`  | 
| bitwise\$1and(bigint, bigint) | bigint（二进制补码） |  返回 bigint 参数的按位与结果。 <pre>SELECT bitwise_and(12, 7)</pre> 示例结果：`4`  | 
| bitwise\$1not(bigint) | bigint（二进制补码） |  返回 bigint 参数的按位非结果。 <pre>SELECT bitwise_not(12)</pre> 示例结果：`-13`  | 
| bitwise\$1or(bigint, bigint) | bigint（二进制补码） |  返回 bigint 参数的按位或结果。 <pre>SELECT bitwise_or(12, 7)</pre> 示例结果：`15`  | 
| bitwise\$1xor(bigint, bigint) | bigint（二进制补码） |  返回 bigint 参数的按位异或结果。 <pre>SELECT bitwise_xor(12, 7)</pre> 示例结果：`11`  | 

# 正则表达式函数
<a name="regex-functions"></a>

Timestream 中的正则表达式函数 LiveAnalytics 支持 [Java 模式语法](http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html)。Timestream LiveAnalytics 支持以下正则表达式函数。


| 函数 | 输出数据类型 | 说明 | 
| --- | --- | --- | 
|  regexp\$1extract\$1all(string, pattern)  |  array(varchar)  |  返回字符串中与正则表达式模式相匹配的子字符串。 <pre>SELECT regexp_extract_all('example expect complex', 'ex\w')</pre> 示例结果：`[ exa,exp ]`  | 
|  regexp\$1extract\$1all(string, pattern, group)  |  array(varchar)  |  在字符串中查找所有符合正则表达式模式的匹配项，并返回 [capturing group number](http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#gnumber) 组。 <pre>SELECT regexp_extract_all('example expect complex', '(ex)(\w)', 2)</pre> 示例结果：`[ a,p ]`  | 
|  regexp\$1extract(string, pattern)  |  varchar  |  返回字符串中与正则表达式模式相匹配的第一个子字符串。 <pre>SELECT regexp_extract('example expect', 'ex\w')</pre> 示例结果：`exa`  | 
|  regexp\$1extract(string, pattern, group)   |  varchar  |  在字符串中查找第一个符合正则表达式模式的匹配项，并返回 [capturing group number](http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#gnumber) 组。 <pre>SELECT regexp_extract('example expect', '(ex)(\w)', 2)</pre> 示例结果：`a`  | 
|  regexp\$1like(string, pattern)   |  布尔值  |  评估正则表达式模式，并判断其是否包含在字符串中。此函数类似于 LIKE 运算符，区别在于模式只需包含在字符串中，而不必匹配所有字符串。换言之，这执行的是包含操作而非匹配操作。您可以使用 ^ 和 \$1 锚定模式来匹配整个字符串。 <pre>SELECT regexp_like('example', 'ex')</pre> 示例结果：`true`  | 
|  regexp\$1replace(string, pattern)  |  varchar  |  从字符串中移除所有匹配正则表达式模式的子字符串实例。 <pre>SELECT regexp_replace('example expect', 'expect')</pre> 示例结果：`example`  | 
|  regexp\$1replace(string, pattern, replacement)   |  varchar  |  将字符串中所有匹配正则表达式模式的子字符串实例替换为替换内容。捕获的分组可在替换时使用 \$1g 表示编号分组，或使用 \$1\$1name\$1 表示命名分组。如需在替换内容中包含美元符号（\$1），可通过反斜杠（\$1\$1）进行转义。 <pre>SELECT regexp_replace('example expect', 'expect', 'surprise')</pre> 示例结果：`example surprise`  | 
|  regexp\$1replace(string, pattern, function)   |  varchar  |  使用函数替换字符串中所有匹配正则表达式模式的子字符串实例。每次匹配都会调用 [lambda expression](https://prestodb.io/docs/current/functions/lambda.html) 函数，并将捕获组作为数组传递。捕获组编号从 1 开始；整个匹配项没有组（如果需要，请用括号将整个表达式括起来）。 <pre>SELECT regexp_replace('example', '(\w)', x -> upper(x[1]))</pre> 示例结果：`EXAMPLE`  | 
|  regexp\$1split(string, pattern)   |  array(varchar)  |  使用正则表达式模式拆分字符串，并返回数组。保留尾随的空字符串。 <pre>SELECT regexp_split('example', 'x')</pre> 示例结果：`[ e,ample ]`  | 

# 日期/时间运算符
<a name="date-time-operators"></a>

**注意**  
的时间流 LiveAnalytics 不支持负时间值。任何导致负时间的操作均会导致错误。

Timestream LiveAnalytics 支持对`timestamps``dates`、和`intervals`进行以下操作。


| 运算符 | 说明 | 
| --- | --- | 
|  \$1  |  加  | 
|  -  |  减  | 

**Topics**
+ [操作](#date-time-operators-operations)
+ [加](#date-time-operators-addition)
+ [减](#date-time-operators-subtraction)

## 操作
<a name="date-time-operators-operations"></a>

运算的结果类型取决于操作数。可以使用间隔表示形式，例如 `1day` 和 `3s`。。

```
SELECT date '2022-05-21' + interval '2' day
```

```
SELECT date '2022-05-21' + 2d
```

```
SELECT date '2022-05-21' + 2day
```

各间隔的示例结果：`2022-05-23`

间隔单位包括 `second`、`minute`、`hour`、`day`、`week`、`month` 和 `year`。但某些情况下并非全部适用。例如，无法对日期进行秒、分、小时的增减操作。

```
SELECT interval '4' year + interval '2' month
```

示例结果：`4-2`

```
SELECT typeof(interval '4' year + interval '2' month)
```

示例结果：`interval year to month`

间隔运算的结果类型可能为 `'interval year to month'` 或 `'interval day to second'`，具体取决于操作数。间隔运算可对 `dates` 和 `timestamps` 进行加减操作。但是，`date` 或 `timestamp` 不能与 `date` 或 `timestamp` 相加或相减。要查找与日期或时间戳相关的间隔或持续时间，请参阅 `date_diff` 及[间隔和持续时间](date-time-functions.md#date-time-functions-interval-duration)中的相关函数。

## 加
<a name="date-time-operators-addition"></a>

**Example**  

```
SELECT date '2022-05-21' + interval '2' day
```
示例结果：`2022-05-23`

**Example**  

```
SELECT typeof(date '2022-05-21' + interval '2' day)
```
示例结果：`date`

**Example**  

```
SELECT interval '2' year + interval '4' month
```
示例结果：`2-4`

**Example**  

```
SELECT typeof(interval '2' year + interval '4' month)
```
示例结果：`interval year to month`

## 减
<a name="date-time-operators-subtraction"></a>

**Example**  

```
SELECT timestamp '2022-06-17 01:00' - interval '7' hour
```
示例结果：`2022-06-16 18:00:00.000000000`

**Example**  

```
SELECT typeof(timestamp '2022-06-17 01:00' - interval '7' hour)
```
示例结果：`timestamp`

**Example**  

```
SELECT interval '6' day - interval '4' hour
```
示例结果：`5 20:00:00.000000000`

**Example**  

```
SELECT typeof(interval '6' day - interval '4' hour)
```
示例结果：`interval day to second`

# 日期/时间函数
<a name="date-time-functions"></a>

**注意**  
的时间流 LiveAnalytics 不支持负时间值。任何导致负时间的操作均会导致错误。

timestream LiveAnalytics 使用 UTC 时区作为日期和时间。Timestream 支持以下日期和时间函数。

**Topics**
+ [通用和转换](#date-time-functions-general)
+ [间隔和持续时间](#date-time-functions-interval-duration)
+ [格式化与解析](#date-time-functions-formatting-parsing)
+ [提取](#date-time-functions-extraction)

## 通用和转换
<a name="date-time-functions-general"></a>

Timestream for LiveAnalytics 支持以下日期和时间的常规函数和转换函数。


| 函数 | 输出数据类型 | 说明 | 
| --- | --- | --- | 
|  current\$1date  |  date  |  返回以 UTC 为单位的当前日期。未使用括号。 <pre>SELECT current_date</pre> 示例结果：`2022-07-07`  这也是一个保留关键字。有关保留关键字的列表，请参阅[保留关键字](ts-limits.md#limits.reserved)。   | 
|  current\$1time  |  时间  |  返回以 UTC 为单位的当前时间。未使用括号。 <pre>SELECT current_time</pre> 示例结果：`17:41:52.827000000`  这也是一个保留关键字。有关保留关键字的列表，请参阅[保留关键字](ts-limits.md#limits.reserved)。   | 
|  current\$1timestamp or now()  |  timestamp  |  返回以 UTC 为单位的当前时间戳。 <pre>SELECT current_timestamp</pre> 示例结果：`2022-07-07 17:42:32.939000000`  这也是一个保留关键字。有关保留关键字的列表，请参阅[保留关键字](ts-limits.md#limits.reserved)。   | 
|  current\$1timezone()  |  varchar 该值将是“UTC”。  |  Timestream 使用 UTC 时区作为日期和时间标准。 <pre>SELECT current_timezone()</pre> 示例结果：`UTC`  | 
|  date(varchar(x)), date(timestamp)  |  date  |  <pre>SELECT date(TIMESTAMP '2022-07-07 17:44:43.771000000')</pre> 示例结果：`2022-07-07`  | 
|  last\$1day\$1of\$1month(timestamp), last\$1day\$1of\$1month(date)  |  date  |  <pre>SELECT last_day_of_month(TIMESTAMP '2022-07-07 17:44:43.771000000')</pre> 示例结果：`2022-07-31`  | 
|  from\$1iso8601\$1timestamp(string)  |  timestamp  |  将 ISO 8601 时间戳解析为内部时间戳格式。 <pre>SELECT from_iso8601_timestamp('2022-06-17T08:04:05.000000000+05:00')</pre> 示例结果：`2022-06-17 03:04:05.000000000`  | 
|  from\$1iso8601\$1date(string)  |  date  |  将 ISO 8601 日期字符串解析为指定日期 UTC 00:00:00 的内部时间戳格式。 <pre>SELECT from_iso8601_date('2022-07-17')</pre> 示例结果：`2022-07-17`  | 
|  to\$1iso8601(timestamp), to\$1iso8601(date)  |  varchar  |  返回输入的 ISO 8601 格式字符串。 <pre>SELECT to_iso8601(from_iso8601_date('2022-06-17'))</pre> 示例结果：`2022-06-17`  | 
|  from\$1milliseconds(bigint)  |  timestamp  |  <pre>SELECT from_milliseconds(1)</pre> 示例结果：`1970-01-01 00:00:00.001000000`  | 
|  from\$1nanoseconds(bigint)  |  timestamp  |  <pre>select from_nanoseconds(300000001)</pre> 示例结果：`1970-01-01 00:00:00.300000001`  | 
|  from\$1unixtime(double)  |  timestamp  |  返回与给定 unixtime 相对应的时间戳。 <pre>SELECT from_unixtime(1)</pre> 示例结果：`1970-01-01 00:00:01.000000000`  | 
|  localtime  |  时间  |  返回以 UTC 为单位的当前时间。未使用括号。 <pre>SELECT localtime</pre> 示例结果：`17:58:22.654000000`  这也是一个保留关键字。有关保留关键字的列表，请参阅[保留关键字](ts-limits.md#limits.reserved)。   | 
|  localtimestamp  |  timestamp  |  返回以 UTC 为单位的当前时间戳。未使用括号。 <pre>SELECT localtimestamp</pre> 示例结果：`2022-07-07 17:59:04.368000000`  这也是一个保留关键字。有关保留关键字的列表，请参阅[保留关键字](ts-limits.md#limits.reserved)。   | 
|  to\$1milliseconds(interval day to second), to\$1milliseconds(timestamp)  |  bigint  |  <pre>SELECT to_milliseconds(INTERVAL '2' DAY + INTERVAL '3' HOUR)</pre> 示例结果：`183600000` <pre>SELECT to_milliseconds(TIMESTAMP '2022-06-17 17:44:43.771000000')</pre> 示例结果：`1655487883771`  | 
|  to\$1nanoseconds(interval day to second), to\$1nanoseconds(timestamp)  |  bigint  |  <pre>SELECT to_nanoseconds(INTERVAL '2' DAY + INTERVAL '3' HOUR)</pre> 示例结果：`183600000000000` <pre>SELECT to_nanoseconds(TIMESTAMP '2022-06-17 17:44:43.771000678')</pre> 示例结果：`1655487883771000678`  | 
|  to\$1unixtime(timestamp)  |  double  |  返回给定时间戳的 unixtime。 <pre>SELECT to_unixtime('2022-06-17 17:44:43.771000000')</pre> 示例结果：`1.6554878837710001E9`  | 
|  date\$1trunc(unit, timestamp)  |  timestamp  |  返回截断为指定单位的时间戳，单位为 [秒、分钟、小时、日、周、月、季度、年] 其中之一。 <pre>SELECT date_trunc('minute', TIMESTAMP '2022-06-17 17:44:43.771000000')</pre> 示例结果：`2022-06-17 17:44:00.000000000`  | 

## 间隔和持续时间
<a name="date-time-functions-interval-duration"></a>

Timestream for LiveAnalytics 支持以下日期和时间间隔和持续时间函数。


| 函数 | 输出数据类型 | 说明 | 
| --- | --- | --- | 
|  date\$1add(unit, bigint, date), date\$1add(unit, bigint, time), date\$1add(varchar(x), bigint, timestamp)  |  timestamp  |  添加 bigint，单位为 [秒、分钟、小时、日、周、月、季度、年] 其中之一。 <pre>SELECT date_add('hour', 9, TIMESTAMP '2022-06-17 00:00:00')</pre> 示例结果：`2022-06-17 09:00:00.000000000`  | 
|  date\$1diff(unit, date, date) , date\$1diff(unit, time, time) , date\$1diff(unit, timestamp, timestamp)  |  bigint  |  返回差值，其中单位为 [秒、分钟、小时、日、周、月、季度、年] 之一。 <pre>SELECT date_diff('day', DATE '2020-03-01', DATE '2020-03-02')</pre> 示例结果：`1`  | 
|  parse\$1duration(string)  |  interval  |  解析输入字符串，以返回等效的 `interval`。 <pre>SELECT parse_duration('42.8ms')</pre> 示例结果：`0 00:00:00.042800000` <pre>SELECT typeof(parse_duration('42.8ms'))</pre> 示例结果：`interval day to second`  | 
| bin(timestamp, interval) | timestamp |  将参数 `timestamp` 的整数部分向下取整，取其最接近的参数 `interval` 的整数倍数。 此返回值的含义可能并不明显。该值通过整数运算计算得出：首先将时间戳整数除以间隔整数，然后将结果乘以间隔整数。 请注意，时间戳将 UTC 时间点指定为自 POSIX epoch（1970 年 1 月 1 日）起经过的若干个零点几秒，因此其返回值很少与日历时间单位完全对应。例如，如果指定 30 天间隔，则自 epoch 以来所有天数都将划分为 30 天增量，并返回最近 30 天增量的起始点，该起始点与日历月份无关。 下面是一些示例： <pre>bin(TIMESTAMP '2022-06-17 10:15:20', 5m)     ==> 2022-06-17 10:15:00.000000000<br />bin(TIMESTAMP '2022-06-17 10:15:20', 1d)     ==> 2022-06-17 00:00:00.000000000<br />bin(TIMESTAMP '2022-06-17 10:15:20', 10day)  ==> 2022-06-17 00:00:00.000000000<br />bin(TIMESTAMP '2022-06-17 10:15:20', 30day)  ==> 2022-05-28 00:00:00.000000000</pre>  | 
|  ago(interval)  |  timestamp  |  返回与 current\$1timestamp `interval` 对应的值。 <pre>SELECT ago(1d)</pre> 示例结果：`2022-07-06 21:08:53.245000000`  | 
|  间隔字面值，例如 1h、1d 和 30m  |  interval  |  间隔字面值是 parse\$1duration(string) 的简易形式。例如，`1d` 与 `parse_duration('1d')` 相同。这允许在任何使用间隔的地方使用字面值。例如，`ago(1d)` 和 `bin(<timestamp>, 1m)`。  | 

一些间隔字面值可作为 parse\$1duration 的简写形式。例如，`parse_duration('1day')`、`1day`、`parse_duration('1d')` 和 `1d` 均返回 `1 00:00:00.000000000`，其中类型为 `interval day to second`。允许给定格式 `parse_duration` 中存在空格。例如，`parse_duration('1day')` 也返回 `00:00:00.000000000`。但 `1 day` 不是间隔字面值。

与 `interval day to second` 相关的单位包括：ns（纳秒）、us（微秒）、ms（毫秒）、s（秒）、m（分钟）、h（小时）、d（天）。

还有 `interval year to month`。与间隔年到月相关的单位包括：y（年）、月。例如，`SELECT 1year` 返回 `1-0`。`SELECT 12month` 也返回 `1-0`。`SELECT 8month` 返回 `0-8`。

尽管 `quarter` 的单位也可用于某些函数，例如 `date_trunc` 和 `date_add`，但 `quarter` 不能作为间隔字面值使用。

## 格式化与解析
<a name="date-time-functions-formatting-parsing"></a>

Timestream for LiveAnalytics 支持以下日期和时间的格式化和解析函数。


| 函数 | 输出数据类型 | 说明 | 
| --- | --- | --- | 
|  date\$1format(timestamp, varchar(x))  |  varchar  |  [有关此函数使用的格式说明符的更多信息，请参见 \$1 https://trino.io/docs/current/functions/datetime.html mysql-date-functions](https://trino.io/docs/current/functions/datetime.html#mysql-date-functions) <pre>SELECT date_format(TIMESTAMP '2019-10-20 10:20:20', '%Y-%m-%d %H:%i:%s')</pre> 示例结果：`2019-10-20 10:20:20`  | 
|  date\$1parse(varchar(x), varchar(y))  |  timestamp  |  [有关此函数使用的格式说明符的更多信息，请参见 \$1 https://trino.io/docs/current/functions/datetime.html mysql-date-functions](https://trino.io/docs/current/functions/datetime.html#mysql-date-functions) <pre>SELECT date_parse('2019-10-20 10:20:20', '%Y-%m-%d %H:%i:%s')</pre> 示例结果：`2019-10-20 10:20:20.000000000`  | 
|  format\$1datetime(timestamp, varchar(x))  |  varchar  |  有关此函数使用的格式字符串的更多信息，请参阅 [http://joda-time.sourceforge。 net/apidocs/org/joda/time/format/DateTimeFormat.html](http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html) <pre>SELECT format_datetime(parse_datetime('1968-01-13 12', 'yyyy-MM-dd HH'), 'yyyy-MM-dd HH')</pre> 示例结果：`1968-01-13 12`  | 
|  parse\$1datetime(varchar(x), varchar(y))  |  timestamp  |  有关此函数使用的格式字符串的更多信息，请参阅 [http://joda-time.sourceforge。 net/apidocs/org/joda/time/format/DateTimeFormat.html](http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html) <pre>SELECT parse_datetime('2019-12-29 10:10 PST', 'uuuu-LL-dd HH:mm z')</pre> 示例结果：`2019-12-29 18:10:00.000000000`  | 

## 提取
<a name="date-time-functions-extraction"></a>

Timestream for LiveAnalytics 支持以下日期和时间提取函数。提取函数是其余便捷函数的基础。


| 函数 | 输出数据类型 | 说明 | 
| --- | --- | --- | 
|  extract  |  bigint  |  从时间戳中提取字段，字段为 [YEAR、QUARTER、MONTH、WEEK、DAY、DAY\$1OF\$1MONTH、DAY\$1OF\$1WEEK、DOW、DAY\$1OF\$1YEAR、DOY、YEAR\$1OF\$1WEEK、YOW、HOUR、MINUTE、SECOND] 其中之一。 <pre>SELECT extract(YEAR FROM '2019-10-12 23:10:34.000000000')</pre> 示例结果：`2019`  | 
|  day(timestamp), day(date), day(interval day to second)  |  bigint  |  <pre>SELECT day('2019-10-12 23:10:34.000000000')</pre> 示例结果：`12`  | 
|  day\$1of\$1month(timestamp), day\$1of\$1month(date), day\$1of\$1month(interval day to second)  |  bigint  |  <pre>SELECT day_of_month('2019-10-12 23:10:34.000000000')</pre> 示例结果：`12`  | 
|  day\$1of\$1week(timestamp), day\$1of\$1week(date)  |  bigint  |  <pre>SELECT day_of_week('2019-10-12 23:10:34.000000000')</pre> 示例结果：`6`  | 
|  day\$1of\$1year(timestamp), day\$1of\$1year(date)  |  bigint  |  <pre>SELECT day_of_year('2019-10-12 23:10:34.000000000')</pre> 示例结果：`285`  | 
|  dow(timestamp), dow(date)  |  bigint  |  day\$1of\$1week 的别名  | 
|  doy(timestamp), doy(date)  |  bigint  |  day\$1of\$1year 的别名  | 
|  hour(timestamp), hour(time), hour(interval day to second)  |  bigint  |  <pre>SELECT hour('2019-10-12 23:10:34.000000000')</pre> 示例结果：`23`  | 
|  millisecond(timestamp), millisecond(time), millisecond(interval day to second)  |  bigint  |  <pre>SELECT millisecond('2019-10-12 23:10:34.000000000')</pre> 示例结果：`0`  | 
|  minute(timestamp), minute(time), minute(interval day to second)  |  bigint  |  <pre>SELECT minute('2019-10-12 23:10:34.000000000')</pre> 示例结果：`10`  | 
|  month(timestamp), month(date), month(interval year to month)  |  bigint  |  <pre>SELECT month('2019-10-12 23:10:34.000000000')</pre> 示例结果：`10`  | 
|  nanosecond(timestamp), nanosecond(time), nanosecond(interval day to second)  |  bigint  |  <pre>SELECT nanosecond(current_timestamp)</pre> 示例结果：`162000000`  | 
|  quarter(timestamp), quarter(date)  |  bigint  |  <pre>SELECT quarter('2019-10-12 23:10:34.000000000')</pre> 示例结果：`4`  | 
|  second(timestamp), second(time), second(interval day to second)  |  bigint  |  <pre>SELECT second('2019-10-12 23:10:34.000000000')</pre> 示例结果：`34`  | 
|  week(timestamp), week(date)  |  bigint  |  <pre>SELECT week('2019-10-12 23:10:34.000000000')</pre> 示例结果：`41`  | 
|  week\$1of\$1year(timestamp), week\$1of\$1year(date)  |  bigint  |  week 的别名  | 
|  year(timestamp), year(date), year(interval year to month)  |  bigint  |  <pre>SELECT year('2019-10-12 23:10:34.000000000')</pre> 示例结果：`2019`  | 
|  year\$1of\$1week(timestamp), year\$1of\$1week(date)  |  bigint  |  <pre>SELECT year_of_week('2019-10-12 23:10:34.000000000')</pre> 示例结果：`2019`  | 
|  yow(timestamp), yow(date)  |  bigint  |  year\$1of\$1week 的别名  | 

# 聚合函数
<a name="aggregate-functions"></a>

Timestream LiveAnalytics 支持以下聚合函数。


| 函数 | 输出数据类型 | 说明 | 
| --- | --- | --- | 
|  arbitrary(x)  |  [与输入相同]  |  返回 x 的任意非 null 值（如果存在）。 <pre>SELECT arbitrary(t.c) FROM (VALUES 1, 2, 3, 4) AS t(c)</pre> 示例结果：`1`  | 
|  array\$1agg(x)  |  数组<[与输入相同]  |  返回由输入 x 个元素创建的数组。 <pre>SELECT array_agg(t.c) FROM (VALUES 1, 2, 3, 4) AS t(c)</pre> 示例结果：`[ 1,2,3,4 ]`  | 
|  avg(x)  |  double  |  返回所有输入值的平均值（算术平均值）。 <pre>SELECT avg(t.c) FROM (VALUES 1, 2, 3, 4) AS t(c)</pre> 示例结果：`2.5`  | 
|  bool\$1and(boolean) every(boolean)   |  布尔值  |  如果每个输入值都为 TRUE，则返回 TRUE，否则返回 FALSE。 <pre>SELECT bool_and(t.c) FROM (VALUES true, true, false, true) AS t(c)</pre> 示例结果：`false`  | 
|  bool\$1or(boolean)  |  布尔值  |  如果任何输入值为 TRUE，则返回 TRUE，否则返回 FALSE。 <pre>SELECT bool_or(t.c) FROM (VALUES true, true, false, true) AS t(c)</pre> 示例结果：`true`  | 
|  count(\$1) count(x)  |  bigint  |  count(\$1) 返回输入行的数量。 count(x) 返回非 null 输入值的数量。 <pre>SELECT count(t.c) FROM (VALUES true, true, false, true) AS t(c)</pre> 示例结果：`4`  | 
|  count\$1if(x)   |  bigint  |  返回 TRUE 输入值的数量。 <pre>SELECT count_if(t.c) FROM (VALUES true, true, false, true) AS t(c)</pre> 示例结果：`3`  | 
|  geometric\$1mean(x)  |  double  |  返回所有输入值的几何平均值。 <pre>SELECT geometric_mean(t.c) FROM (VALUES 1, 2, 3, 4) AS t(c)</pre> 示例结果：`2.213363839400643`  | 
|  max\$1by(x, y)   |  [与 x 相同]  |  返回所有输入值中与 y 的最大值相关联的 x 值。 <pre>SELECT max_by(t.c1, t.c2) FROM (VALUES (('a', 1)), (('b', 2)), (('c', 3)), (('d', 4))) AS t(c1, c2)</pre> 示例结果：`d`  | 
|  max\$1by(x, y, n)   |  数组<[与 x 相同]>  |  返回与所有输入 y 值中降序排列的 n 个最大值相关联的 n 个 x 值。 <pre>SELECT max_by(t.c1, t.c2, 2) FROM (VALUES (('a', 1)), (('b', 2)), (('c', 3)), (('d', 4))) AS t(c1, c2)</pre> 示例结果：`[ d,c ]`  | 
|  min\$1by(x, y)  |  [与 x 相同]  |  返回所有输入值中与 y 的最小值相关联的 x 值。 <pre>SELECT min_by(t.c1, t.c2) FROM (VALUES (('a', 1)), (('b', 2)), (('c', 3)), (('d', 4))) AS t(c1, c2)</pre> 示例结果：`a`  | 
|  min\$1by(x, y, n)  |  数组<[与 x 相同]>  |  返回与所有输入 y 值中升序排列的 n 个最小值相关联的 n 个 x 值。 <pre>SELECT min_by(t.c1, t.c2, 2) FROM (VALUES (('a', 1)), (('b', 2)), (('c', 3)), (('d', 4))) AS t(c1, c2)</pre> 示例结果：`[ a,b ]`  | 
|  max(x)  |  [与输入相同]  |  返回所有输入值的最大值。 <pre>SELECT max(t.c) FROM (VALUES 1, 2, 3, 4) AS t(c)</pre> 示例结果：`4`  | 
|  max(x, n)  |  数组<[与 x 相同]>  |  返回 x 的所有输入值中的 n 个最大值。 <pre>SELECT max(t.c, 2) FROM (VALUES 1, 2, 3, 4) AS t(c)</pre> 示例结果：`[ 4,3 ]`  | 
|  min(x)  |  [与输入相同]  |  返回所有输入值的最小值。 <pre>SELECT min(t.c) FROM (VALUES 1, 2, 3, 4) AS t(c)</pre> 示例结果：`1`  | 
|  min(x, n)  |  数组<[与 x 相同]>  |  返回 x 的所有输入值中的 n 个最小值。 <pre>SELECT min(t.c, 2) FROM (VALUES 1, 2, 3, 4) AS t(c)</pre> 示例结果：`[ 1,2 ]`  | 
|  sum(x)   |  [与输入相同]  |  返回所有输入值的总和。 <pre>SELECT sum(t.c) FROM (VALUES 1, 2, 3, 4) AS t(c)</pre> 示例结果：`10`  | 
|  bitwise\$1and\$1agg(x)  |  bigint  |  返回所有输入值以 2 补码表示形式的按位与结果。 <pre>SELECT bitwise_and_agg(t.c) FROM (VALUES 1, -3) AS t(c)</pre> 示例结果：`1`  | 
|  bitwise\$1or\$1agg(x)  |  bigint  |  返回所有输入值以 2 补码表示形式的按位或结果。 <pre>SELECT bitwise_or_agg(t.c) FROM (VALUES 1, -3) AS t(c)</pre> 示例结果：`-3`  | 
|  approx\$1distinct(x)   |  bigint  |  返回输入值中不同值的大致数量 此函数提供对 count(DISTINCT x) 的近似值。如果所有输入值均为 null，则返回零。此函数应生成 2.3% 的标准误差，即所有可能集合（近似正态）误差分布的标准差。该函数不能保证对任何特定输入集的误差存在上限。 <pre>SELECT approx_distinct(t.c) FROM (VALUES 1, 2, 3, 4, 8) AS t(c)</pre> 示例结果：`5`  | 
|  approx\$1distinct(x, e)  |  bigint  |  返回输入值中不同值的大致数量 此函数提供对 count(DISTINCT x) 的近似值。如果所有输入值均为 null，则返回零。此函数应生成不大于 e 的标准误差，即所有可能集合（近似正态）误差分布的标准差。该函数不能保证对任何特定输入集的误差存在上限。此函数的当前实施要求 e 在 [0.0040625，0.26000] 范围内。 <pre>SELECT approx_distinct(t.c, 0.2) FROM (VALUES 1, 2, 3, 4, 8) AS t(c)</pre> 示例结果：`5`  | 
|  approx\$1percentile(x, percentage)   |  [与 x 相同]  |  返回所有输入值 x 在给定百分比下的近似百分位数。百分比值必须介于零到一之间，且对所有输入行保持恒定。 <pre>SELECT approx_percentile(t.c, 0.4) FROM (VALUES 1, 2, 3, 4) AS t(c)</pre> 示例结果：`2`  | 
|  approx\$1percentile(x, percentages)   |  数组<[与 x 相同]>  |  返回所有输入值 x 在每个指定百分比下的近似百分位数。百分比数组的每个元素都必须介于零到一之间，且该数组对所有输入行必须保持恒定。 <pre>SELECT approx_percentile(t.c, ARRAY[0.1, 0.8, 0.8]) FROM (VALUES 1, 2, 3, 4) AS t(c)</pre> 示例结果：`[ 1,4,4 ]`  | 
|  approx\$1percentile(x, w, percentage)   |  [与 x 相同]  |  返回所有输入值 x 在百分比 p 处使用单项权重 w 计算的近似加权百分位数。权重必须是至少为 1 的整数值。该值实际上是百分位数集中值 x 的复制计数。p 值必须介于零到一之间，且对所有输入行保持恒定。 <pre>SELECT approx_percentile(t.c, 1, 0.1) FROM (VALUES 1, 2, 3, 4) AS t(c)</pre> 示例结果：`1`  | 
|  approx\$1percentile(x, w, percentages)   |  数组<[与 x 相同]>  |  返回所有输入值 x 在数组中指定百分比处使用每项权重 w 计算的近似加权百分位数。权重必须是至少为 1 的整数值。该值实际上是百分位数集中值 x 的复制计数。数组的每个元素都必须介于零到一之间，且该数组对所有输入行必须保持恒定。 <pre>SELECT approx_percentile(t.c, 1, ARRAY[0.1, 0.8, 0.8]) FROM (VALUES 1, 2, 3, 4) AS t(c)</pre> 示例结果：`[ 1,4,4 ]`  | 
|  approx\$1percentile(x, w, percentage, accuracy)  |  [与 x 相同]  |  返回所有输入值 x 在百分比 p 处使用单项权重 w 计算的近似加权百分位数，最大等级误差为精度。权重必须是至少为 1 的整数值。该值实际上是百分位数集中值 x 的复制计数。p 值必须介于零到一之间，且对所有输入行保持恒定。精度必须是大于零且小于一的值，且对所有输入行保持恒定。 <pre>SELECT approx_percentile(t.c, 1, 0.1, 0.5) FROM (VALUES 1, 2, 3, 4) AS t(c)</pre> 示例结果：`1`  | 
|  corr(y, x)  |  double  |  返回输入值的相关系数。 <pre>SELECT corr(t.c1, t.c2) FROM (VALUES ((1, 1)), ((2, 2)), ((3, 3)), ((4, 4))) AS t(c1, c2)</pre> 示例结果：`1.0`  | 
|  covar\$1pop(y, x)  |  double  |  返回输入值的总体协方差。 <pre>SELECT covar_pop(t.c1, t.c2) FROM (VALUES ((1, 1)), ((2, 2)), ((3, 3)), ((4, 4))) AS t(c1, c2)</pre> 示例结果：`1.25`  | 
|  covar\$1samp(y, x)   |  double  |  返回输入值的样本协方差。 <pre>SELECT covar_samp(t.c1, t.c2) FROM (VALUES ((1, 1)), ((2, 2)), ((3, 3)), ((4, 4))) AS t(c1, c2)</pre> 示例结果：`1.6666666666666667`  | 
|  regr\$1intercept(y, x)  |  double  |  返回输入值的线性回归截距。y 为因变量，x 为自变量。 <pre>SELECT regr_intercept(t.c1, t.c2) FROM (VALUES ((1, 1)), ((2, 2)), ((3, 3)), ((4, 4))) AS t(c1, c2)</pre> 示例结果：`0.0`  | 
|  regr\$1slope(y, x)  |  double  |  返回输入值的线性回归斜率。y 为因变量，x 为自变量。 <pre>SELECT regr_slope(t.c1, t.c2) FROM (VALUES ((1, 1)), ((2, 2)), ((3, 3)), ((4, 4))) AS t(c1, c2)</pre> 示例结果：`1.0`  | 
|  skewness(x)  |  double  |  返回所有输入值的偏度。 <pre>SELECT skewness(t.c1) FROM (VALUES 1, 2, 3, 4, 8) AS t(c1)</pre> 示例结果：`0.8978957037987335`  | 
|  stddev\$1pop(x)  |  double  |  返回所有输入值的总体标准差 <pre>SELECT stddev_pop(t.c1) FROM (VALUES 1, 2, 3, 4, 8) AS t(c1)</pre> 示例结果：`2.4166091947189146`  | 
|  stddev\$1samp(x) stddev(x)  |  double  |  返回所有输入值的样本标准差。 <pre>SELECT stddev_samp(t.c1) FROM (VALUES 1, 2, 3, 4, 8) AS t(c1)</pre> 示例结果：`2.701851217221259`  | 
|  var\$1pop(x)   |  double  |  返回所有输入值的总体方差。 <pre>SELECT var_pop(t.c1) FROM (VALUES 1, 2, 3, 4, 8) AS t(c1)</pre> 示例结果：`5.840000000000001`  | 
|  var\$1samp(x) variance(x)   |  double  |  返回所有输入值的样本方差。 <pre>SELECT var_samp(t.c1) FROM (VALUES 1, 2, 3, 4, 8) AS t(c1)</pre> 示例结果：`7.300000000000001`  | 

# 窗口函数
<a name="window-functions"></a>

窗口函数对查询结果的各行进行计算。该函数在 HAVING 子句之后但在 ORDER BY 子句之前运行。调用窗口函数需要使用特殊语法，通过 OVER 子句指定窗口。窗口包含三个组件：
+ 分区规范，用于将输入行划分为不同的分区。这类似于 GROUP BY 子句将行划分为不同组以便进行聚合函数计算的方式。
+ 排序规范，用于确定窗口函数处理输入行时的顺序。
+ 窗口框架，用于指定函数处理给定行时所涉及的行数范围。如果未指定框架，则默认为 RANGE UNBOUNDED PRECEDING，这与 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 相同。此框架包含从分区开头到当前行最后一个对等节点的所有行。

所有聚合函数均可通过添加 OVER 子句作为窗口函数使用。聚合函数针对当前行窗口框架内的每行数据进行计算。除了聚合函数外，Timestream 还 LiveAnalytics 支持以下排名和值函数。


| 函数 | 输出数据类型 | 说明 | 
| --- | --- | --- | 
|  cume\$1dist()  |  bigint  |  返回某个值在值组中的累积分布。结果是窗口分区窗口排序中该行之前或与该行同级的行数除以窗口分区中的总行数。因此，排序中的任何平局值均计算为相同的分布值。  | 
|  dense\$1rank()  |  bigint  |  返回某个值在值组中的排序。这与 rank() 类似，不同之处在于平局值不会导致序列出现间隔。  | 
|  ntile(n)  |  bigint  |  将每个窗口分区的行划分为 n 个存储桶，桶号范围从 1 到最大 n。存储桶值最多相差 1。如果分区的行数不能被存储桶的数量整除，则将剩余行值从第一个存储桶开始，按每个存储桶分配一行。  | 
|  percent\$1rank()  |  double  |  返回某个值在值组中的百分比排序。结果为 (r - 1) / (n - 1)，其中 r 是该行的秩，n 是窗口分区中的总行数。  | 
|  rank()  |  bigint  |  返回某个值在值组中的排序。排序等于 1 加上该行之前所有非同级行的行数。因此，排序中的平局值将导致序列出现间隔。对每个窗口分区进行排序。  | 
|  row\$1number()  |  bigint  |  根据窗口分区内行的排序，为每行返回一个唯一的序号，从 1 开始。  | 
|  first\$1value(x)  |  [与输入相同]  |  返回窗口的第一个值。此函数的作用域限定在窗口框架内。该函数以表达式或目标作为其参数。  | 
|  last\$1value(x)  |  [与输入相同]  |  返回窗口的最后一个值。此函数的作用域限定在窗口框架内。该函数以表达式或目标作为其参数。  | 
|  nth\$1value(x, offset)  |  [与输入相同]  |  返回窗口起始位置指定偏移量处的值。偏移量从 1 开始。偏移量可以是任意标量表达式。如果偏移量为 null 或大于窗口中的值数，则返回 null。偏移量为零或负值时将导致错误。该函数以表达式或目标作为其第一个参数。  | 
|  lead(x[, offset[, default\$1value]])  |  [与输入相同]  |  返回窗口中当前行之后偏移行数处的值。偏移量从 0 开始，即当前行。偏移量可以是任意标量表达式。默认偏移量为 1。如果偏移量为 null 或大于窗口范围，则返回 default\$1value；如果未指定，则返回 null。该函数以表达式或目标作为其第一个参数。  | 
|  lag(x[, offset[, default\$1value]])  |  [与输入相同]  |  返回窗口中当前行之前偏移行数处的值。偏移量从 0 开始，即当前行。偏移量可以是任意标量表达式。默认偏移量为 1。如果偏移量为 null 或大于窗口范围，则返回 default\$1value；如果未指定，则返回 null。该函数以表达式或目标作为其第一个参数。  | 

# 查询示例
<a name="sample-queries"></a>

本节包括 Timestream 的查询语言 LiveAnalytics的示例用例。

**Topics**
+ [简单查询](sample-queries.basic-scenarios.md)
+ [包含时间序列函数的查询](sample-queries.devops-scenarios.md)
+ [使用聚合函数查询](sample-queries.iot-scenarios.md)

# 简单查询
<a name="sample-queries.basic-scenarios"></a>

以下是最近为表添加的 10 个数据点。

```
SELECT * FROM <database_name>.<table_name>
ORDER BY time DESC
LIMIT 10
```

以下是特定度量的 5 个最早数据点。

```
SELECT * FROM <database_name>.<table_name>
WHERE measure_name = '<measure_name>'
ORDER BY time ASC
LIMIT 5
```

以下内容采用纳秒级粒度的时间戳。

```
SELECT now() AS time_now
, now() - (INTERVAL '12' HOUR) AS twelve_hour_earlier -- Compatibility with ANSI SQL 
, now() - 12h AS also_twelve_hour_earlier -- Convenient time interval literals
, ago(12h) AS twelve_hours_ago -- More convenience with time functionality
, bin(now(), 10m) AS time_binned -- Convenient time binning support
, ago(50ns) AS fifty_ns_ago -- Nanosecond support
, now() + (1h + 50ns) AS hour_fifty_ns_future
```

多度量记录的度量值由列名进行标识。单度量记录的度量值由 `measure_value::<data_type>` 进行表示，其中 `<data_type>` 为 `double`、`bigint`、`boolean` 或 `varchar` 其中之一（如 [支持的数据类型](supported-data-types.md) 中所述）。有关度量值建模方式的更多信息，请参阅[单表与多表](https://docs.aws.amazon.com/timestream/latest/developerguide/data-modeling.html#data-modeling-multiVsinglerecords)。

以下内容从多度量记录中检索名为 `speed` 的度量的值，其中 `measure_name` 为 `IoTMulti-stats`。

```
SELECT speed FROM <database_name>.<table_name> where measure_name = 'IoTMulti-stats'
```

以下内容从单度量记录中检索 `double` 值，其中`measure_name` 为 `load`。

```
SELECT measure_value::double FROM <database_name>.<table_name> WHERE measure_name = 'load'
```

# 包含时间序列函数的查询
<a name="sample-queries.devops-scenarios"></a>

**Topics**
+ [示例数据集和查询](#sample-queries.devops-scenarios.example)

## 示例数据集和查询
<a name="sample-queries.devops-scenarios.example"></a>

您可以使用 Timestream LiveAnalytics 来了解和提高您的服务和应用程序的性能和可用性。以下是示例表及其上运行的示例查询。

表 `ec2_metrics` 存储遥测数据，例如 EC2 实例的 CPU 利用率及其他指标。您可以查看下表。


| 时间 | region | az | 主机名 | measure\$1name | measure\$1value::double | measure\$1value::bigint | 
| --- | --- | --- | --- | --- | --- | --- | 
|  2019-12-04 19:00:00.000000000  |  us-east-1  |  us–east–1a  |  frontend01  |  cpu\$1utilization  |  35.1  |  null  | 
|  2019-12-04 19:00:00.000000000  |  us-east-1  |  us–east–1a  |  frontend01  |  memory\$1utilization  |  55.3  |  null  | 
|  2019-12-04 19:00:00.000000000  |  us-east-1  |  us–east–1a  |  frontend01  |  network\$1bytes\$1in  |  null  |  1500  | 
|  2019-12-04 19:00:00.000000000  |  us-east-1  |  us–east–1a  |  frontend01  |  network\$1bytes\$1out  |  null  |  6,700  | 
|  2019-12-04 19:00:00.000000000  |  us-east-1  |  us–east–1b  |  frontend02  |  cpu\$1utilization  |  38.5  |  null  | 
|  2019-12-04 19:00:00.000000000  |  us-east-1  |  us–east–1b  |  frontend02  |  memory\$1utilization  |  58.4  |  null  | 
|  2019-12-04 19:00:00.000000000  |  us-east-1  |  us–east–1b  |  frontend02  |  network\$1bytes\$1in  |  null  |  23,000  | 
|  2019-12-04 19:00:00.000000000  |  us-east-1  |  us–east–1b  |  frontend02  |  network\$1bytes\$1out  |  null  |  12000  | 
|  2019-12-04 19:00:00.000000000  |  us-east-1  |  us–east–1c  |  frontend03  |  cpu\$1utilization  |  45.0  |  null  | 
|  2019-12-04 19:00:00.000000000  |  us-east-1  |  us–east–1c  |  frontend03  |  memory\$1utilization  |  65.8  |  null  | 
|  2019-12-04 19:00:00.000000000  |  us-east-1  |  us–east–1c  |  frontend03  |  network\$1bytes\$1in  |  null  |  15000  | 
|  2019-12-04 19:00:00.000000000  |  us-east-1  |  us–east–1c  |  frontend03  |  network\$1bytes\$1out  |  null  |  836,000  | 
|  2019-12-04 19:00:05.000000000  |  us-east-1  |  us–east–1a  |  frontend01  |  cpu\$1utilization  |  55.2  |  null  | 
|  2019-12-04 19:00:05.000000000  |  us-east-1  |  us–east–1a  |  frontend01  |  memory\$1utilization  |  75.0  |  null  | 
|  2019-12-04 19:00:05.000000000  |  us-east-1  |  us–east–1a  |  frontend01  |  network\$1bytes\$1in  |  null  |  1,245  | 
|  2019-12-04 19:00:05.000000000  |  us-east-1  |  us–east–1a  |  frontend01  |  network\$1bytes\$1out  |  null  |  68,432  | 
|  2019-12-04 19:00:08.000000000  |  us-east-1  |  us–east–1b  |  frontend02  |  cpu\$1utilization  |  65.6  |  null  | 
|  2019-12-04 19:00:08.000000000  |  us-east-1  |  us–east–1b  |  frontend02  |  memory\$1utilization  |  85.3  |  null  | 
|  2019-12-04 19:00:08.000000000  |  us-east-1  |  us–east–1b  |  frontend02  |  network\$1bytes\$1in  |  null  |  1,245  | 
|  2019-12-04 19:00:08.000000000  |  us-east-1  |  us–east–1b  |  frontend02  |  network\$1bytes\$1out  |  null  |  68,432  | 
|  2019-12-04 19:00:20.000000000  |  us-east-1  |  us–east–1c  |  frontend03  |  cpu\$1utilization  |  12.1  |  null  | 
|  2019-12-04 19:00:20.000000000  |  us-east-1  |  us–east–1c  |  frontend03  |  memory\$1utilization  |  32.0  |  null  | 
|  2019-12-04 19:00:20.000000000  |  us-east-1  |  us–east–1c  |  frontend03  |  network\$1bytes\$1in  |  null  |  1,400  | 
|  2019-12-04 19:00:20.000000000  |  us-east-1  |  us–east–1c  |  frontend03  |  network\$1bytes\$1out  |  null  |  345  | 
|  2019-12-04 19:00:10.000000000  |  us-east-1  |  us–east–1a  |  frontend01  |  cpu\$1utilization  |  15.3  |  null  | 
|  2019-12-04 19:00:10.000000000  |  us-east-1  |  us–east–1a  |  frontend01  |  memory\$1utilization  |  35.4  |  null  | 
|  2019-12-04 19:00:10.000000000  |  us-east-1  |  us–east–1a  |  frontend01  |  network\$1bytes\$1in  |  null  |  23  | 
|  2019-12-04 19:00:10.000000000  |  us-east-1  |  us–east–1a  |  frontend01  |  network\$1bytes\$1out  |  null  |  0  | 
|  2019-12-04 19:00:16.000000000  |  us-east-1  |  us–east–1b  |  frontend02  |  cpu\$1utilization  |  44.0  |  null  | 
|  2019-12-04 19:00:16.000000000  |  us-east-1  |  us–east–1b  |  frontend02  |  memory\$1utilization  |  64.2  |  null  | 
|  2019-12-04 19:00:16.000000000  |  us-east-1  |  us–east–1b  |  frontend02  |  network\$1bytes\$1in  |  null  |  1,450  | 
|  2019-12-04 19:00:16.000000000  |  us-east-1  |  us–east–1b  |  frontend02  |  network\$1bytes\$1out  |  null  |  200  | 
|  2019-12-04 19:00:40.000000000  |  us-east-1  |  us–east–1c  |  frontend03  |  cpu\$1utilization  |  66.4  |  null  | 
|  2019-12-04 19:00:40.000000000  |  us-east-1  |  us–east–1c  |  frontend03  |  memory\$1utilization  |  86.3  |  null  | 
|  2019-12-04 19:00:40.000000000  |  us-east-1  |  us–east–1c  |  frontend03  |  network\$1bytes\$1in  |  null  |  300  | 
|  2019-12-04 19:00:40.000000000  |  us-east-1  |  us–east–1c  |  frontend03  |  network\$1bytes\$1out  |  null  |  423  | 

计算过去 2 小时内特定 EC2 主机的平均 CPU 利用率、p90、p95 和 p99：

```
SELECT region, az, hostname, BIN(time, 15s) AS binned_timestamp,
    ROUND(AVG(measure_value::double), 2) AS avg_cpu_utilization,
    ROUND(APPROX_PERCENTILE(measure_value::double, 0.9), 2) AS p90_cpu_utilization,
    ROUND(APPROX_PERCENTILE(measure_value::double, 0.95), 2) AS p95_cpu_utilization,
    ROUND(APPROX_PERCENTILE(measure_value::double, 0.99), 2) AS p99_cpu_utilization
FROM "sampleDB".DevOps
WHERE measure_name = 'cpu_utilization'
    AND hostname = 'host-Hovjv'
    AND time > ago(2h)
GROUP BY region, hostname, az, BIN(time, 15s)
ORDER BY binned_timestamp ASC
```

确定 CPU 利用率比过去 2 小时整个实例集平均 CPU 利用率高出 10% 或以上的 EC2 主机：

```
WITH avg_fleet_utilization AS (
    SELECT COUNT(DISTINCT hostname) AS total_host_count, AVG(measure_value::double) AS fleet_avg_cpu_utilization
    FROM "sampleDB".DevOps
    WHERE measure_name = 'cpu_utilization'
        AND time > ago(2h)
), avg_per_host_cpu AS (
    SELECT region, az, hostname, AVG(measure_value::double) AS avg_cpu_utilization
    FROM "sampleDB".DevOps
    WHERE measure_name = 'cpu_utilization'
        AND time > ago(2h)
    GROUP BY region, az, hostname
)
SELECT region, az, hostname, avg_cpu_utilization, fleet_avg_cpu_utilization
FROM avg_fleet_utilization, avg_per_host_cpu
WHERE avg_cpu_utilization > 1.1 * fleet_avg_cpu_utilization
ORDER BY avg_cpu_utilization DESC
```

计算过去 2 小时内特定 EC2 主机的 CPU 平均利用率，按 30 秒间隔进行分箱：

```
SELECT BIN(time, 30s) AS binned_timestamp, ROUND(AVG(measure_value::double), 2) AS avg_cpu_utilization
FROM "sampleDB".DevOps
WHERE measure_name = 'cpu_utilization'
    AND hostname = 'host-Hovjv'
    AND time > ago(2h)
GROUP BY hostname, BIN(time, 30s)
ORDER BY binned_timestamp ASC
```

计算过去 2 小时内特定 EC2 主机的 CPU 平均利用率，按 30 秒间隔进行分箱，并使用线性插值填补缺失值：

```
WITH binned_timeseries AS (
    SELECT hostname, BIN(time, 30s) AS binned_timestamp, ROUND(AVG(measure_value::double), 2) AS avg_cpu_utilization
    FROM "sampleDB".DevOps
    WHERE measure_name = 'cpu_utilization'
        AND hostname = 'host-Hovjv'
        AND time > ago(2h)
    GROUP BY hostname, BIN(time, 30s)
), interpolated_timeseries AS (
    SELECT hostname,
        INTERPOLATE_LINEAR(
            CREATE_TIME_SERIES(binned_timestamp, avg_cpu_utilization),
                SEQUENCE(min(binned_timestamp), max(binned_timestamp), 15s)) AS interpolated_avg_cpu_utilization
    FROM binned_timeseries
    GROUP BY hostname
)
SELECT time, ROUND(value, 2) AS interpolated_cpu
FROM interpolated_timeseries
CROSS JOIN UNNEST(interpolated_avg_cpu_utilization)
```

计算过去 2 小时内特定 EC2 主机的 CPU 平均利用率，按 30 秒间隔进行分箱，并使用基于末次观测值结转的插值填补缺失值：

```
WITH binned_timeseries AS (
    SELECT hostname, BIN(time, 30s) AS binned_timestamp, ROUND(AVG(measure_value::double), 2) AS avg_cpu_utilization
    FROM "sampleDB".DevOps
    WHERE measure_name = 'cpu_utilization'
        AND hostname = 'host-Hovjv'
        AND time > ago(2h)
    GROUP BY hostname, BIN(time, 30s)
), interpolated_timeseries AS (
    SELECT hostname,
        INTERPOLATE_LOCF(
            CREATE_TIME_SERIES(binned_timestamp, avg_cpu_utilization),
                SEQUENCE(min(binned_timestamp), max(binned_timestamp), 15s)) AS interpolated_avg_cpu_utilization
    FROM binned_timeseries
    GROUP BY hostname
)
SELECT time, ROUND(value, 2) AS interpolated_cpu
FROM interpolated_timeseries
CROSS JOIN UNNEST(interpolated_avg_cpu_utilization)
```

# 使用聚合函数查询
<a name="sample-queries.iot-scenarios"></a>

以下是 IoT 场景示例数据集的示例，用于说明使用聚合函数的查询。

**Topics**
+ [示例数据](#sample-queries.iot-scenarios.example-data)
+ [示例查询](#sample-queries.iot-scenarios.example-queries)

## 示例数据
<a name="sample-queries.iot-scenarios.example-data"></a>

Timestream 使您能够存储和分析 IoT 传感器数据，例如一个或多个卡车车队的位置、油耗、速度和载重，从而实现有效的车队管理。以下是 iot\$1trucks 表的架构和部分数据，该表存储卡车的位置、油耗、速度和载重等遥测数据。


| 时间 | truck\$1id | Make | 模型 | Fleet | fuel\$1capacity | load\$1capacity | measure\$1name | measure\$1value::double | measure\$1value::varchar | 
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | 
|  2019-12-04 19:00:00.000000000  |  123456781  |  GMC  |  Astro  |  Alpha  |  100  |  500  |  fuel\$1reading  |  65.2  |  null  | 
|  2019-12-04 19:00:00.000000000  |  123456781  |  GMC  |  Astro  |  Alpha  |  100  |  500  |  负载  |  400.0  |  null  | 
|  2019-12-04 19:00:00.000000000  |  123456781  |  GMC  |  Astro  |  Alpha  |  100  |  500  |  speed  |  90.2  |  null  | 
|  2019-12-04 19:00:00.000000000  |  123456781  |  GMC  |  Astro  |  Alpha  |  100  |  500  |  地点  |  null  |  47.6062 N, 122.3321 W  | 
|  2019-12-04 19:00:00.000000000  |  123456782  |  Kenworth  |  W900  |  Alpha  |  150  |  1000  |  fuel\$1reading  |  10.1  |  null  | 
|  2019-12-04 19:00:00.000000000  |  123456782  |  Kenworth  |  W900  |  Alpha  |  150  |  1000  |  负载  |  950.3  |  null  | 
|  2019-12-04 19:00:00.000000000  |  123456782  |  Kenworth  |  W900  |  Alpha  |  150  |  1000  |  speed  |  50.8  |  null  | 
|  2019-12-04 19:00:00.000000000  |  123456782  |  Kenworth  |  W900  |  Alpha  |  150  |  1000  |  地点  |  null  |  北纬 40.7128 度，西经 74.0060 度  | 

## 示例查询
<a name="sample-queries.iot-scenarios.example-queries"></a>

获取车队中每辆卡车正在监控的所有传感器属性及值的列表。

```
SELECT
    truck_id,
    fleet,
    fuel_capacity,
    model,
    load_capacity,
    make,
    measure_name
FROM "sampleDB".IoT
GROUP BY truck_id, fleet, fuel_capacity, model, load_capacity, make, measure_name
```

获取车队中每辆卡车过去 24 小时内的最新燃油读数。

```
WITH latest_recorded_time AS (
    SELECT
        truck_id,
        max(time) as latest_time
    FROM "sampleDB".IoT
    WHERE measure_name = 'fuel-reading'
    AND time >= ago(24h)
    GROUP BY truck_id
)
SELECT
    b.truck_id,
    b.fleet,
    b.make,
    b.model,
    b.time,
    b.measure_value::double as last_reported_fuel_reading
FROM
latest_recorded_time a INNER JOIN "sampleDB".IoT b
ON a.truck_id = b.truck_id AND b.time = a.latest_time
WHERE b.measure_name = 'fuel-reading'
AND b.time > ago(24h)
ORDER BY b.truck_id
```

确定过去 48 小时内燃油量低于 10% 的卡车：

```
WITH low_fuel_trucks AS (
    SELECT time, truck_id, fleet, make, model, (measure_value::double/cast(fuel_capacity as double)*100) AS fuel_pct
    FROM "sampleDB".IoT
    WHERE time >= ago(48h)
    AND (measure_value::double/cast(fuel_capacity as double)*100) < 10
    AND measure_name = 'fuel-reading'
),
other_trucks AS (
SELECT time, truck_id, (measure_value::double/cast(fuel_capacity as double)*100) as remaining_fuel
    FROM "sampleDB".IoT
    WHERE time >= ago(48h)
    AND truck_id IN (SELECT truck_id FROM low_fuel_trucks)
    AND (measure_value::double/cast(fuel_capacity as double)*100) >= 10
    AND measure_name = 'fuel-reading'
),
trucks_that_refuelled AS (
    SELECT a.truck_id
    FROM low_fuel_trucks a JOIN other_trucks b
    ON a.truck_id = b.truck_id AND b.time >= a.time
)
SELECT DISTINCT truck_id, fleet, make, model, fuel_pct
FROM low_fuel_trucks
WHERE truck_id NOT IN (
    SELECT truck_id FROM trucks_that_refuelled
)
```

计算过去一周每辆卡车的平均载重和最高速度：

```
SELECT
    bin(time, 1d) as binned_time,
    fleet,
    truck_id,
    make,
    model,
    AVG(
        CASE WHEN measure_name = 'load' THEN measure_value::double ELSE NULL END
    ) AS avg_load_tons,
    MAX(
        CASE WHEN measure_name = 'speed' THEN measure_value::double ELSE NULL END
    ) AS max_speed_mph
FROM "sampleDB".IoT
WHERE time >= ago(7d)
AND measure_name IN ('load', 'speed')
GROUP BY fleet, truck_id, make, model, bin(time, 1d)
ORDER BY truck_id
```

获取过去一周每辆卡车的装载效率：

```
WITH average_load_per_truck AS (
    SELECT
        truck_id,
        avg(measure_value::double)  AS avg_load
    FROM "sampleDB".IoT
    WHERE measure_name = 'load'
    AND time >= ago(7d)
    GROUP BY truck_id, fleet, load_capacity, make, model
),
truck_load_efficiency AS (
    SELECT
        a.truck_id,
        fleet,
        load_capacity,
        make,
        model,
        avg_load,
        measure_value::double,
        time,
        (measure_value::double*100)/avg_load as load_efficiency -- , approx_percentile(avg_load_pct, DOUBLE '0.9')
    FROM "sampleDB".IoT a JOIN average_load_per_truck b
    ON a.truck_id = b.truck_id
    WHERE a.measure_name = 'load'
)
SELECT
    truck_id,
    time,
    load_efficiency
FROM truck_load_efficiency
ORDER BY truck_id, time
```