7.InfluxDB-InfluxQL基礎語法教程--INTO子句


本文翻譯自官網,官網地址:(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

  1. 示例一

    在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 *
  1. 示例二
    將一次查詢結果寫入到一個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。

  2. 示例三
    將查詢結果插入到一個全路徑的measurement中

    Note that both where_else and autogen must exist prior to running the INTO query.

  3. 示例四
    將聚合查詢結果插入到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)

  1. 示例五
    將多個表的匯總查詢結果,復制到另一個庫中
    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子句實現實時的查詢數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM