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。:MEASUREMENT是FROM子句中每個匹配的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®.