INTO子句

更新时间:

INTO子句将查询结果写入到用户指定的measurement中。

语法

SELECT_clause INTO <measurement_name> FROM_clause [WHERE_clause] [GROUP_BY_clause]

语法描述

INTO子句支持多种指定measurement的格式:

INTO <measurement_name>将数据写入到一个指定的measurement。如果您使用CLI写入数据,那么写入数据的measurement属于”USE”指定的数据库,并且使用的是默认(DEFAULT)的保留策略。如果您使用的是HTTP API,那么写入数据的measurement属于参数db指定的数据库,同样,使用的是默认(DEFAULT)的保留策略。

INTO <database_name>.<retention_policy_name>.<measurement_name>将数据写入到一个完全限定的measurement。通过明确指定measurement的数据库和保留策略来完全限定一个measurement。

INTO <database_name>..<measurement_name>将数据写入到一个measurement,这个measurement属于一个用户指定的数据库并使用默认保留策略。

INTO <database_name>.<retention_policy_name>.:MEASUREMENT FROM /<regular_expression>/将数据写入到与FROM子句中正则表达式相匹配的所有在用户指定的数据库和保留策略中的measurement。:MEASUREMENTFROM子句中每个匹配的measurement的反向引用(backreference)。

示例

重命名数据库

 SELECT * INTO "copy_NOAA_water_database"."autogen".:MEASUREMENT FROM "NOAA_water_database"."autogen"./.*/ GROUP BY *

name: result
time written
---- -------
0    76290

在TSDB For InfluxDB®中不能直接重命名数据库,所以INTO子句的一个常见用例是将数据从一个数据库移动到另外一个数据库。以上查询将数据库NOAA_water_database的保留策略autogen中的所有数据写入到数据库copy_NOAA_water_database的保留策略autogen中。

反向引用语法(:MEASUREMENT)将源数据库中measurement的名字维持在目标数据库中不变。请注意,在执行INTO查询之前,数据库NOAA_water_database及其保留策略autogen都必须已经存在。有关如何管理数据库和保留策略,请查看数据库管理章节。

GROUP BY *子句将源数据库中的tag保留在目标数据库中。以下查询并不为tag维护序列的上下文,tag将作为field保存在目标数据库(copy_NOAA_water_database)中:

SELECT * INTO "copy_NOAA_water_database"."autogen".:MEASUREMENT FROM "NOAA_water_database"."autogen"./.*/

当移动大量数据时,我们建议按顺序对不同的measurement运行INTO查询,并且使用WHERE子句中的时间边界。这样可以防止系统内存不足。下面的代码块提供了这类查询的示例语法:

SELECT *
INTO <destination_database>.<retention_policy_name>.<measurement_name>
FROM <source_database>.<retention_policy_name>.<measurement_name>
WHERE time > now() - 100w and time < now() - 90w GROUP BY *

SELECT *
INTO <destination_database>.<retention_policy_name>.<measurement_name>
FROM <source_database>.<retention_policy_name>.<measurement_name>}
WHERE time > now() - 90w  and time < now() - 80w GROUP BY *

SELECT *
INTO <destination_database>.<retention_policy_name>.<measurement_name>
FROM <source_database>.<retention_policy_name>.<measurement_name>
WHERE time > now() - 80w  and time < now() - 70w GROUP BY *

将查询结果写入measurement

 SELECT "water_level" INTO "h2o_feet_copy_1" FROM "h2o_feet" WHERE "location" = 'coyote_creek'

name: result
------------
time                   written
1970-01-01T00:00:00Z   7604

 SELECT * FROM "h2o_feet_copy_1"

name: h2o_feet_copy_1
---------------------
time                   water_level
2015-08-18T00:00:00Z   8.12
[...]
2015-09-18T16:48:00Z   4

该查询将它的结果写入到一个新的measurement:h2o_feet_copy_1。如果您使用CLI写入数据,那么数据会写入到USE指定的数据库,并且使用的是默认(DEFAULT)的保留策略。如果您使用的是HTTP API,那么数据会写入到参数db指定的数据库,并且使用参数rp指定的保留策略。如果没有设置参数rp,HTTP API自动将数据写入到数据库的默认保留策略中。

返回结果显示TSDB For InfluxDB®写入到h2o_feet_copy_1中的数据点个数(7604)。返回结果中的时间戳是没有意义的,TSDB For InfluxDB®使用epoch 0(即1970-01-01T00:00:00Z)作为空时间戳。

将查询结果写入完全限定的measurement

 SELECT "water_level" INTO "where_else"."autogen"."h2o_feet_copy_2" FROM "h2o_feet" WHERE "location" = 'coyote_creek'

name: result
------------
time                   written
1970-01-01T00:00:00Z   7604

 SELECT * FROM "where_else"."autogen"."h2o_feet_copy_2"

name: h2o_feet_copy_2
---------------------
time                   water_level
2015-08-18T00:00:00Z   8.12
[...]
2015-09-18T16:48:00Z   4

该查询将它的结果写入到一个新的measurement:h2o_feet_copy_2。TSDB For InfluxDB®将数据写入到数据库where_else的保留策略autogen中。请注意,在执行INTO查询前,数据库where_else及其保留策略autogen都必须已经存在。有关如何管理数据库和保留策略,请查看数据库管理章节。

返回结果显示TSDB For InfluxDB®写入到h2o_feet_copy_2中的数据点个数(7604)。返回结果中的时间戳是没有意义的,TSDB For InfluxDB®使用epoch 0(即1970-01-01T00:00:00Z)作为空时间戳。

将聚合结果写入measurement(降采样)

 SELECT MEAN("water_level") INTO "all_my_averages" FROM "h2o_feet" WHERE "location" = 'coyote_creek' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m)

name: result
------------
time                   written
1970-01-01T00:00:00Z   3

 SELECT * FROM "all_my_averages"

name: all_my_averages
---------------------
time                   mean
2015-08-18T00:00:00Z   8.0625
2015-08-18T00:12:00Z   7.8245
2015-08-18T00:24:00Z   7.5675

该查询使用了一个InfluxQL函数和一个GROUP BY time()子句将数据进行聚合,并且将结果写入到measurement all_my_averages

返回结果显示TSDB For InfluxDB®写入到all_my_averages中的数据点个数(3)。返回结果中的时间戳是没有意义的,TSDB For InfluxDB®使用epoch 0(即1970-01-01T00:00:00Z)作为空时间戳。

该查询是降采样(downsampling)的一个示例:获取更高精度的数据并将这些数据聚合到较低精度,然后将较低精度的数据存储到数据库。降采样是INTO子句的一个常见用例。

数据写入

将多个measurement的聚合结果写入一个不同的数据库(使用反向引用进行降采样)。

 SELECT MEAN(*) INTO "where_else"."autogen".:MEASUREMENT FROM /.*/ WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:06:00Z' GROUP BY time(12m)

name: result
time                   written
----                   -------
1970-01-01T00:00:00Z   5

 SELECT * FROM "where_else"."autogen"./.*/

name: average_temperature
time                   mean_degrees   mean_index   mean_pH   mean_water_level
----                   ------------   ----------   -------   ----------------
2015-08-18T00:00:00Z   78.5

name: h2o_feet
time                   mean_degrees   mean_index   mean_pH   mean_water_level
----                   ------------   ----------   -------   ----------------
2015-08-18T00:00:00Z                                         5.07625

name: h2o_pH
time                   mean_degrees   mean_index   mean_pH   mean_water_level
----                   ------------   ----------   -------   ----------------
2015-08-18T00:00:00Z                               6.75

name: h2o_quality
time                   mean_degrees   mean_index   mean_pH   mean_water_level
----                   ------------   ----------   -------   ----------------
2015-08-18T00:00:00Z                  51.75

name: h2o_temperature
time                   mean_degrees   mean_index   mean_pH   mean_water_level
----                   ------------   ----------   -------   ----------------
2015-08-18T00:00:00Z   63.75

该查询使用了一个InfluxQL函数和一个GROUP BY time()子句将数据进行聚合,它将与FROM子句中正则表达式匹配的所有measurement中的数据进行聚合,并将结果写入到数据库where_else和查询策略autogen中有相同名字的measurement。请注意,在执行INTO查询前,数据库where_else及其保留策略autogen都必须已经存在。

返回结果显示TSDB For InfluxDB®写入到数据库where_else和查询策略autogen中的数据点个数(5)。返回结果中的时间戳是没有意义的,TSDB For InfluxDB®使用epoch 0(即1970-01-01T00:00:00Z)作为空时间戳。

该查询是使用反向引用进行降采样(downsampling with backreferencing)的一个示例:从多个measurement中获取更高精度的数据并将这些数据聚合到较低精度,然后将较低精度的数据存储到数据库。使用反向引用进行降采样是INTO子句的一个常见用例。

INTO子句的常见问题

数据丢失

如果一个INTO查询在SELECT子句中包含tag key,那么查询将当前measurement中的tag转换为目标measurement的field,这可能会导致TSDB For InfluxDB®覆盖以前由tag value区分的数据点。请注意,此行为不适用于使用TOP()BOTTOM()函数的查询。

为了将当前measurement中的tag保留为目标measurement中的tag,可以在INTO查询中加上GROUP BY子句:GROUP BY相关的tag key或者GROUP BY *

使用INTO子句自动查询

本文档中的INTO子句章节展示了如何使用INTO子句手动实现查询。通过连续查询(CQ),可以使INTO子句自动查询实时数据。连续查询其中一个用途就是使降采样的过程自动化。

InfluxDB® is a trademark registered by InfluxData, which is not affiliated with, and does not endorse, TSDB for InfluxDB®.