本文翻譯自官網,官網地址:(https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/)
通過INTO子句,可以將用戶的查詢結果插入到用戶指定的measurement中。
語法
SELECT_clause
INTO <measurement_name>
FROM_clause [WHERE_clause] [GROUP_BY_clause]
INTO子句支持如下語法,使得用戶可以使用不同方式來指定要插入數據的measurement:
子句 | 意義 |
---|---|
INTO <measurement_name> | 插入到指定measurement中。此時使用的是當前庫、使用默認的retention policy |
INTO <database_name>.<retention_policy_name>.<measurement_name> | 往全路徑的measurement中插入數據。此時指定了庫、指定retention policy、指定measurement |
INTO <database_name>..<measurement_name> | 往指定庫的指定measurement中插入數據,使用默認的retention policy |
INTO <database_name>.<retention_policy_name>.:MEASUREMENT FROM /<regular_expression>/ | 往指定庫、指定retentioin policy,並且符合FROM子句中的正則規則的measurement中插入數據 |
INTO示例sql
- 示例一
在InfluxDB中,是無法直接重命名一個庫的,所以一個通常的做法是,像如上的sql那樣,把一個庫的所有數據全部復制到另一庫中去。
其中 GROUP BY * 子句使得在源庫中是tag key的字段,復制到目標庫中之后依然是tag key。下面的sql就不維護tag的series上下文環境,如此一來在源庫中的tag key在被復制到目標庫之后,就變成fields了:
SELECT *
INTO "copy_NOAA_water_database"."autogen".:MEASUREMENT
FROM "NOAA_water_database"."autogen"./.*/
當需要復制大量的數據時,官方推薦一個一個measurement的進行復制,並且最好通過WHERE子句來指定時間區間,這樣可以避免系統出現內存溢出的錯誤。如下面的sql就展示了通過指定時間區間來分批的進行數據復制操作:
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中:
上面sql將它的查詢結果插入到一個新建的名為h2o_feet_copy_1的measurement中。執行sql的結果顯示總共插入了7604條結果數據到h2o_feet_copy_1中,時間戳1970-01-01T00:00:00Z則沒有什么意思,前面說過,在InfluxDB中,使用1970-01-01T00:00:00Z來表示timestamp的null。 -
示例三
將查詢結果插入到一個全路徑的measurement中
Note that both where_else and autogen must exist prior to running the INTO query. -
示例四
將聚合查詢結果插入到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)
- 示例五
將多個表的匯總查詢結果,復制到另一個庫中
Sql
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)
查詢結果
INTO子句常見問題
問題1:丟失數據
如果在一個INTO查詢中,再把數據復制到目標庫時會把源庫的tag key轉換為fields,這可能會導致influxdb覆蓋先前由tag key區分的點。注意,此行為不適用於使用top()或bottom()函數的查詢。在常見問題文檔中可查看到該問題的詳細描述。
為了防止源庫的tag key復制到目標庫之后編程fields,可以在INTO查詢sql中使用group by有意義的tag key,或者group by \*.問題2:使用into子句自動化查詢
本小節展示了如何通過into子句來實現手動插入復制數據的操作。可以在Continuous Queries的相關文檔中查看到如何利用into子句實現實時的查詢數據。