使用选择器函数来评估、选择和返回数据中的值。选择器函数从每个 InfluxQL 组中返回包含选定值的一行或多行。
示例使用 InfluxDB 入门教程 中提供的示例数据集。
缺失的 InfluxQL 函数
部分 InfluxQL 函数正在进行重构,以适配 InfluxDB 3 存储引擎。如果您需要的函数在此列表中未出现,请参阅 InfluxQL 功能支持页面 以获取更多信息。
BOTTOM()
返回最小的 N 个 字段值。BOTTOM() 支持 int64 和 float64 字段值 数据类型。
BOTTOM(field_expression[, tag_expression_1[, ..., tag_expression_n]], N)
注意: 如果两个或多个值相等且都是最小值,则 BOTTOM() 返回时间戳最早的字段值。
参数
- field_expression:用于标识要操作的字段的表达式。可以是 字段键 或常量。
- tag_expression:用于标识用于分段的标签键的表达式。可以是 标签键 或常量。使用逗号分隔多个标签。
- N:要从每个 InfluxQL 组或指定的标签段返回的结果数。
注意事项
示例
选择字段的底部三个值
SELECT BOTTOM(temp, 3) FROM home
| time | bottom |
|---|
| 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
| time | bottom | room |
|---|
| 2022-01-01T08:00:00Z | 21 | 厨房 |
| 2022-01-01T08:00:00Z | 21.1 | 客厅 |
选择底部三个字段值以及与每个字段值关联的标签值
SELECT BOTTOM(temp, 3), room FROM home
| time | bottom | room |
|---|
| 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)
| time | bottom | room |
|---|
| 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() 保留数据点的原始时间戳。
FIRST()
返回具有最旧时间戳的 字段值。
参数
- field_expression:用于标识要操作的一个或多个字段的表达式。可以是 字段键、常量、正则表达式或通配符 (
*)。支持所有字段 数据类型。
注意事项
示例
选择字段的第一个值
SELECT FIRST(temp) FROM home
| time | first |
|---|
| 2022-01-01T08:00:00Z | 21.1 |
选择每个字段的第一个值
SELECT FIRST(*) FROM home
| time | first_co | first_hum | first_temp |
|---|
| 1970-01-01T00:00:00Z | 0 | 35.9 | 21.1 |
从与正则表达式匹配的字段键中选择第一个值
SELECT FIRST(/^[th]/) FROM home
| time | first_hum | first_temp |
|---|
| 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)
| time | first |
|---|
| 2022-01-01T06:00:00Z | 21 |
| 2022-01-01T12:00:00Z | 22.5 |
| 2022-01-01T18:00:00Z | 23.3 |
请注意,按时间分组时,FIRST() 会覆盖数据点的原始时间戳。
LAST()
返回具有最新时间戳的 字段值。
参数
- field_expression:用于标识要操作的一个或多个字段的表达式。可以是 字段键、常量、正则表达式或通配符 (
*)。支持所有字段 数据类型。
注意事项
示例
选择字段的最后一个值
SELECT LAST(temp) FROM home
| time | last |
|---|
| 2022-01-01T20:00:00Z | 22.7 |
选择每个字段的最后一个值
| time | last_co | last_hum | last_temp |
|---|
| 1970-01-01T00:00:00Z | 26 | 36.5 | 22.7 |
从与正则表达式匹配的字段键中选择最后一个值
SELECT LAST(/^[th]/) FROM home
| time | last_hum | last_temp |
|---|
| 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)
| time | last |
|---|
| 2022-01-01T06:00:00Z | 22.4 |
| 2022-01-01T12:00:00Z | 22.7 |
| 2022-01-01T18:00:00Z | 22.7 |
请注意,按时间分组时,LAST() 会覆盖数据点的原始时间戳。
MAX()
返回最大的 字段值。
参数
- field_expression:用于标识要操作的一个或多个字段的表达式。可以是 字段键、常量、正则表达式或通配符 (
*)。支持数值字段。
注意事项
示例
选择字段的最大值
| time | max |
|---|
| 2022-01-01T20:00:00Z | 26 |
选择每个字段的最大值
| time | max_co | max_hum | max_temp |
|---|
| 1970-01-01T00:00:00Z | 26 | 36.9 | 23.3 |
从与正则表达式匹配的字段键中选择最大值
SELECT MAX(/^[th]/) FROM home
| time | max_hum | max_temp |
|---|
| 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)
| time | max |
|---|
| 2022-01-01T06:00:00Z | 23 |
| 2022-01-01T12:00:00Z | 22.8 |
| 2022-01-01T18:00:00Z | 23.3 |
请注意,按时间分组时,MAX() 会覆盖数据点的原始时间戳。
MIN()
返回最小的 字段值。
参数
- field_expression:用于标识要操作的一个或多个字段的表达式。可以是 字段键、常量、正则表达式或通配符 (
*)。支持数值字段。
注意事项
示例
选择字段的最小值
SELECT MIN(temp) FROM home
| time | min |
|---|
| 2022-01-01T08:00:00Z | 21 |
选择每个字段的最小值
| time | min_co | min_hum | min_temp |
|---|
| 1970-01-01T00:00:00Z | 0 | 35.9 | 21 |
从与正则表达式匹配的字段键中选择最小值
SELECT MIN(/^[th]/) FROM home
| time | min_hum | min_temp |
|---|
| 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)
| time | min |
|---|
| 2022-01-01T06:00:00Z | 21 |
| 2022-01-01T12:00:00Z | 22.4 |
| 2022-01-01T18:00:00Z | 22.7 |
请注意,按时间分组时,MIN() 会覆盖数据点的原始时间戳。
PERCENTILE()
返回第 N 百分位的 字段值。
PERCENTILE(field_expression, N)
参数
- field_expression:用于标识要操作的一个或多个字段的表达式。可以是 字段键、常量、正则表达式或通配符 (
*)。支持数值字段。 - N:要返回的百分位数。必须是整数或浮点数值,大于 0 且小于或等于 100。
注意事项
示例
选择字段的第 50 百分位值
SELECT PERCENTILE(temp, 50) FROM home
| time | percentile |
|---|
| 2022-01-01T11:00:00Z | 22.4 |
选择每个字段的第 50 百分位值
SELECT PERCENTILE(*, 50) FROM home
| time | percentile_co | percentile_hum | percentile_temp |
|---|
| 1970-01-01T00:00:00Z | 1 | 36 | 22.4 |
从与正则表达式匹配的字段键中选择第 50 百分位值
SELECT PERCENTILE(/^[th]/, 50) FROM home
| time | percentile_hum | percentile_temp |
|---|
| 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)
| time | percentile |
|---|
| 2022-01-01T06:00:00Z | 22.4 |
| 2022-01-01T12:00:00Z | 22.7 |
| 2022-01-01T18:00:00Z | 23.1 |
请注意,按时间分组时,PERCENTILE() 会覆盖数据点的原始时间戳。
TOP()
返回最大的 N 个 字段值。TOP() 支持 int64 和 float64 字段值 数据类型。
TOP(field_expression[, tag_expression_1[, ..., tag_expression_n]], N)
注意: 如果两个或多个值相等且都是最大值,则 TOP() 返回时间戳最早的字段值。
参数
- field_expression:用于标识要操作的字段的表达式。可以是 字段键 或常量。
- tag_expression:用于标识用于分段的标签键的表达式。可以是 标签键 或常量。使用逗号分隔多个标签。
- N:要从每个 InfluxQL 组或指定的标签段返回的结果数。
注意事项
示例
选择字段的顶部三个值
SELECT TOP(temp, 3) FROM home
| time | top |
|---|
| 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
| time | top | room |
|---|
| 2022-01-01T18:00:00Z | 23.3 | 厨房 |
| 2022-01-01T18:00:00Z | 22.8 | 客厅 |
选择顶部三个字段值以及与每个字段值关联的标签值
SELECT TOP(temp, 3), room FROM home
| time | top | room |
|---|
| 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)
| time | top | room |
|---|
| 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) 的示例
下面的示例选择厨房在 2022-01-01T08:00:00Z 和 2022-01-01T10:00:00Z 之间的底部 5 个温度值。在查询的时间范围内,厨房只记录了 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'
| time | bottom |
|---|
| 2022-01-01T08:00:00Z | 21 |
| 2022-01-01T09:00:00Z | 23 |
| 2022-01-01T10:00:00Z | 22.7 |
查看 FN(field_key, tag_key, N) 的示例
下面的示例选择 room 标签的 3 个唯一值中的顶部温度。但是,room 标签只有 2 个唯一值,因此结果只包含 2 个值。
SELECT TOP(temp, room, 3) FROM home
| time | top | room |
|---|
| 2022-01-01T18:00:00Z | 23.3 | 厨房 |
| 2022-01-01T18:00:00Z | 22.8 | 客厅 |
支持和反馈
感谢您成为我们社区的一员!我们欢迎并鼓励您对 InfluxDB 3 Core 和本文档提供反馈和错误报告。要获得支持,请使用以下资源
具有年度合同或支持合同的客户可以 联系 InfluxData 支持。