全部產品
Search
文件中心

Time Series Database:INTO子句

更新時間:Jul 06, 2024

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子句中Regex相匹配的所有在使用者指定的資料庫和保留原則中的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子句中Regex匹配的所有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®.