InfluxQL 选择器函数
InfluxDB 3 企业版正在公开Alpha测试
InfluxDB 3 Enterprise 处于公开测试阶段,可供测试和反馈,但不适合生产环境使用。产品和该文档均处于不断完善中。我们欢迎并鼓励您分享您对Alpha版本的使用体验,并邀请您加入我们的公共频道以获取更新和分享反馈。
阿尔法预期和建议
- 在 alpha 期间,我们可能会进行重大更改,这需要您删除您的数据并重新开始。如果您使用的数据很重要,请在其他地方保存备份副本。
- 在 alpha 期间,我们在每次合并到 InfluxDB
main 分支时生成新构建。更改频繁,相关更新会发布到我们的公共频道。
使用选择器函数来评估、选择并返回数据中的值。选择器函数返回包含从每个InfluxQL组中选择的值的一行或多行。
示例使用的是提供的示例数据集,详见
开始使用InfluxDB教程.
缺失的InfluxQL函数
一些 InfluxQL 函数正在重新架构以与 InfluxDB 3 存储引擎配合使用。如果您需要的函数不在这里,请查看 InfluxQL 功能支持页面 以获取更多信息。
底部()
返回最小的 N 字段值。
BOTTOM() 支持 int64 和 float64 字段值 数据类型。
BOTTOM(field_expression[, tag_expression_1[, ..., tag_expression_n]], N)
注意: BOTTOM() 在多个最小值相等的情况下,返回具有最早时间戳的字段值。
参数
- field_expression: 用于标识要操作的字段的表达式。 可以是一个 field key 或常量。
- tag_expression: 用于识别标签键以进行分段的表达式。可以是一个 tag key 或常量。使用逗号分隔多个标签。
- N: 从每个 InfluxQL 组或指定标签段返回的结果数量。
显著行为
示例
选择字段中的最低三个值
SELECT BOTTOM(temp, 3) FROM home
| 时间 | 底部 |
|---|
| 2022-01-01T08:00:00Z | 21 |
| 2022-01-01T08:00:00Z | 21.1 |
| 2022-01-01T09:00:00Z | 21.4 |
选择两个唯一标签值的底部字段值
SELECT BOTTOM(temp, room, 2) FROM home
| 时间 | 底部 | 房间 |
|---|
| 2022-01-01T08:00:00Z | 21 | 厨房 |
| 2022-01-01T08:00:00Z | 21.1 | 客厅 |
选择底部三个字段值及与每个字段值相关的标签值
SELECT BOTTOM(temp, 3), room FROM home
| 时间 | 底部 | 房间 |
|---|
| 2022-01-01T08:00:00Z | 21 | 厨房 |
| 2022-01-01T08:00:00Z | 21.1 | 客厅 |
| 2022-01-01T09:00:00Z | 21.4 | 客厅 |
选择唯一标签值和时间窗口内的底部字段值(按时间分组)
SELECT
BOTTOM(temp, room, 2)
FROM home
WHERE
time >= '2022-01-01T08:00:00Z'
AND time <= '2022-01-01T12:00:00Z'
GROUP BY time(2h)
| 时间 | 底部 | 房间 |
|---|
| 2022-01-01T08:00:00Z | 21 | 厨房 |
| 2022-01-01T08:00:00Z | 21.1 | 客厅 |
| 2022-01-01T10:00:00Z | 21.8 | 客厅 |
| 2022-01-01T11:00:00Z | 22.4 | 厨房 |
| 2022-01-01T12:00:00Z | 22.2 | 客厅 |
| 2022-01-01T12:00:00Z | 22.5 | 厨房 |
请注意,当按时间分组时, BOTTOM()
保持点的原始时间戳。
第一次()
返回具有最旧时间戳的 字段值。
参数
- field_expression: 表达式用于识别一个或多个要操作的字段。可以是一个 字段键、常量、正则表达式或通配符 (
*)。支持所有字段 数据类型。
显著行为
示例
选择字段的第一个值
SELECT FIRST(temp) FROM home
| 时间 | 首次 |
|---|
| 2022-01-01T08:00:00Z | 21.1 |
从每个字段中选择第一个值
SELECT FIRST(*) FROM home
| 时间 | 第一个CO | 第一个湿度 | 第一个温度 |
|---|
| 1970-01-01T00:00:00Z | 0 | 35.9 | 21.1 |
从匹配正则表达式的字段键中选择第一个值
SELECT FIRST(/^[th]/) FROM home
| 时间 | 第一次湿度 | 第一次温度 |
|---|
| 1970-01-01T00:00:00Z | 35.9 | 21.1 |
从时间窗口内的字段中选择第一个值(按时间分组)
SELECT
FIRST(temp)
FROM home
WHERE
room = 'Kitchen'
AND time >= '2022-01-01T08:00:00Z'
AND time <= '2022-01-01T20:00:00Z'
GROUP BY time(6h)
| 时间 | 首次 |
|---|
| 2022-01-01T06:00:00Z | 21 |
| 2022-01-01T12:00:00Z | 22.5 |
| 2022-01-01T18:00:00Z | 23.3 |
注意,当按时间分组时, FIRST()
覆盖了点的原始时间戳。
最后()
返回具有最新时间戳的 字段值。
参数
- field_expression: 表达式用于识别一个或多个要操作的字段。可以是一个 字段键、常量、正则表达式或通配符 (
*)。支持所有字段 数据类型。
显著行为
示例
选择字段的最后一个值
SELECT LAST(temp) FROM home
| 时间 | 最后 |
|---|
| 2022年01月01日20:00:00Z | 22.7 |
从每个字段中选择最后一个值
| 时间 | 最后一电流 | 最后一湿度 | 最后一温度 |
|---|
| 1970-01-01T00:00:00Z | 26 | 36.5 | 22.7 |
选择与正则表达式匹配的字段键中的最后一个值
SELECT LAST(/^[th]/) FROM home
| 时间 | 最后湿度 | 最后温度 |
|---|
| 1970-01-01T00:00:00Z | 36.5 | 22.7 |
从时间窗口内的字段选择最后一个值(按时间分组)
SELECT
LAST(temp)
FROM home
WHERE
room = 'Kitchen'
AND time >= '2022-01-01T08:00:00Z'
AND time <= '2022-01-01T20:00:00Z'
GROUP BY time(6h)
| 时间 | 最后 |
|---|
| 2022-01-01T06:00:00Z | 22.4 |
| 2022-01-01T12:00:00Z | 22.7 |
| 2022-01-01T18:00:00Z | 22.7 |
请注意,当按时间分组时, LAST()
会覆盖点的原始时间戳.
最大值()
返回最大的 字段值。
参数
- field_expression: 表达式,用于识别一个或多个要操作的字段。可以是一个字段键,常量,正则表达式,或通配符 (
*)。支持数值字段。
显著行为
示例
选择一个字段中的最大值
| 时间 | 最大值 |
|---|
| 2022-01-01T20:00:00Z | 26 |
从每个字段中选择最大值
| 时间 | 最大一氧化碳 | 最大湿度 | 最大温度 |
|---|
| 1970-01-01T00:00:00Z | 26 | 36.9 | 23.3 |
选择与正则表达式匹配的字段键中的最大值
SELECT MAX(/^[th]/) FROM home
| 时间 | 最大湿度 | 最大温度 |
|---|
| 1970-01-01T00:00:00Z | 36.9 | 23.3 |
在时间窗口内选择字段中的最大值(按时间分组)
SELECT
MAX(temp)
FROM home
WHERE
room = 'Kitchen'
AND time >= '2022-01-01T08:00:00Z'
AND time <= '2022-01-01T20:00:00Z'
GROUP BY time(6h)
| 时间 | 最大值 |
|---|
| 2022年01月01日06:00:00Z | 23 |
| 2022-01-01T12:00:00Z | 22.8 |
| 2022-01-01T18:00:00Z | 23.3 |
请注意,当按时间分组时, MAX()
覆盖了点的原始时间戳。
最小值()
返回最低的 字段值。
参数
- field_expression: 表达式,用于识别一个或多个要操作的字段。可以是一个字段键,常量,正则表达式,或通配符 (
*)。支持数值字段。
显著行为
示例
从一个字段中选择最小值
SELECT MIN(temp) FROM home
| 时间 | 分钟 |
|---|
| 2022-01-01T08:00:00Z | 21 |
从每个字段中选择最小值
| 时间 | 最小CO | 最小湿度 | 最小温度 |
|---|
| 1970-01-01T00:00:00Z | 0 | 35.9 | 21 |
从匹配正则表达式的字段键中选择最小值
SELECT MIN(/^[th]/) FROM home
| 时间 | 最低湿度 | 最低温度 |
|---|
| 1970-01-01T00:00:00Z | 35.9 | 21 |
从时间窗口内的字段中选择最小值(按时间分组)
SELECT
MIN(temp)
FROM home
WHERE
room = 'Kitchen'
AND time >= '2022-01-01T08:00:00Z'
AND time <= '2022-01-01T20:00:00Z'
GROUP BY time(6h)
| 时间 | 分钟 |
|---|
| 2022-01-01T06:00:00Z | 21 |
| 2022-01-01T12:00:00Z | 22.4 |
| 2022-01-01T18:00:00Z | 22.7 |
注意,当按时间分组时, MIN()
覆盖了点的原始时间戳。
百分位数()
返回第 N 个百分位数 字段值。
PERCENTILE(field_expression, N)
参数
- field_expression: 表达式,用于识别一个或多个要操作的字段。可以是一个字段键,常量,正则表达式,或通配符 (
*)。支持数值字段。 - N: 要返回的百分位数。
必须是大于 0 且小于或等于 100的整数或浮点值。
显著行为
示例
从一个字段中选择第50百分位值
SELECT PERCENTILE(temp, 50) FROM home
| 时间 | 百分位数 |
|---|
| 2022-01-01T11:00:00Z | 22.4 |
从每个字段中选择第50百分位值
SELECT PERCENTILE(*, 50) FROM home
| 时间 | 百分位数_co | 百分位数_hum | 百分位数_temp |
|---|
| 1970-01-01T00:00:00Z | 1 | 36 | 22.4 |
从符合正则表达式的字段键中选择第50百分位值
SELECT PERCENTILE(/^[th]/, 50) FROM home
| 时间 | 相对湿度百分位 | 温度百分位 |
|---|
| 1970-01-01T00:00:00Z | 36 | 22.4 |
从时间窗口内的一个字段中选择第50百分位值(按时间分组)
SELECT
PERCENTILE(temp, 50)
FROM home
WHERE
room = 'Kitchen'
AND time >= '2022-01-01T08:00:00Z'
AND time <= '2022-01-01T20:00:00Z'
GROUP BY time(6h)
| 时间 | 百分位数 |
|---|
| 2022-01-01T06:00:00Z | 22.4 |
| 2022-01-01T12:00:00Z | 22.7 |
| 2022-01-01T18:00:00Z | 23.1 |
请注意,当按时间分组时, PERCENTILE()
会覆盖点的原始时间戳。
顶部函数()
返回最大的 N 字段值。
TOP() 支持 int64 和 float64 字段值 数据类型。
TOP(field_expression[, tag_expression_1[, ..., tag_expression_n]], N)
注意: TOP() 在多个值之间存在最大值的平局时返回具有最早时间戳的字段值。
参数
- field_expression: 用于标识要操作的字段的表达式。 可以是一个 field key 或常量。
- tag_expression: 用于识别标签键以进行分段的表达式。可以是一个 tag key 或常量。使用逗号分隔多个标签。
- N: 从每个 InfluxQL 组或指定标签段返回的结果数量。
显著行为
示例
选择一个字段的前三个值
SELECT TOP(temp, 3) FROM home
| 时间 | 顶部 |
|---|
| 2022-01-01T09:00:00Z | 23 |
| 2022-01-01T18:00:00Z | 23.3 |
| 2022年01月01日19:00:00Z | 23.1 |
选择两个唯一标签值的顶级字段值
SELECT TOP(temp, room, 2) FROM home
| 时间 | 顶级 | 房间 |
|---|
| 2022-01-01T18:00:00Z | 23.3 | 厨房 |
| 2022-01-01T18:00:00Z | 22.8 | 客厅 |
选择前三个字段值和与每个值相关联的标签值
SELECT TOP(temp, 3), room FROM home
| 时间 | 顶级 | 房间 |
|---|
| 2022-01-01T09:00:00Z | 23 | 厨房 |
| 2022-01-01T18:00:00Z | 23.3 | 厨房 |
| 2022-01-01T19:00:00Z | 23.1 | 厨房 |
选择唯一标签值和时间窗口内的顶级字段值(按时间分组)
SELECT
TOP(temp, room, 2)
FROM home
WHERE
time >= '2022-01-01T08:00:00Z'
AND time <= '2022-01-01T12:00:00Z'
GROUP BY time(2h)
| 时间 | 顶级 | 房间 |
|---|
| 2022-01-01T09:00:00Z | 23 | 厨房 |
| 2022-01-01T09:00:00Z | 21.4 | 客厅 |
| 2022-01-01T10:00:00Z | 22.7 | 厨房 |
| 2022-01-01T11:00:00Z | 22.2 | 客厅 |
| 2022-01-01T12:00:00Z | 22.5 | 厨房 |
| 2022-01-01T12:00:00Z | 22.2 | 客厅 |
注意,当按时间分组时, TOP()
保持点的原始时间戳。
选择器函数的重要行为
按时间分组的时间戳
当使用带有 GROUP BY time() 子句的选择器函数时,大多数选择器
函数返回每个时间区间的起始边界的时间戳。
但是,带有 N 参数的函数指定了每个组返回的结果数量,保持每个返回点的原始时间戳。
选择器函数可能返回的点数少于预期
使用以下选择器函数并带有N参数的查询可能返回少于预期的点数。
如果 InfluxQL 分组或指定的标签键包含 X 个点或唯一标签值,并且 X 小于 N,则该函数返回 X 个结果,而不是每个分组或标签值的 N 个结果。
查看 FN(field_key, N) 的示例
下面的示例从厨房选择最低的5个温度,在
2022-01-01T08:00:00Z
和 2022-01-01T10:00:00Z 之间。
在查询的时间范围内,只记录了3个数据点,
因此查询返回3个数据点而不是5个。
SELECT BOTTOM(temp, 5)
FROM home
WHERE
time >= '2022-01-01T08:00:00Z'
AND time <= '2022-01-01T10:00:00Z'
AND room = 'Kitchen'
| 时间 | 底部 |
|---|
| 2022-01-01T08:00:00Z | 21 |
| 2022-01-01T09:00:00Z | 23 |
| 2022年01月01日10:00:00Z | 22.7 |
查看 FN(field_key, tag_key, N) 的示例
下面的例子从 room 标签的 3 个唯一值中选择最高温度。 但是, room 标签只有 2 个唯一值,因此结果只包含 2 个值。
SELECT TOP(temp, room, 3) FROM home
| 时间 | 顶级 | 房间 |
|---|
| 2022-01-01T18:00:00Z | 23.3 | 厨房 |
| 2022-01-01T18:00:00Z | 22.8 | 客厅 |