influxDB 變換類函數


1、DERIVATIVE()函數

作用:返回一個字段在一個series中的變化率。

InfluxDB會計算按照時間進行排序的字段值之間的差異,並將這些結果轉化為單位變化率。其中,單位可以指定,默認為1s。

語法:

SELECT DERIVATIVE(<field_key>, [<unit>]) FROM <measurement_name> [WHERE <stuff>]

其中,unit取值可以為以下幾種:

u --microseconds
s --seconds
m --minutes
h --hours
d --days
w --weeks

DERIVATIVE()函數還可以在GROUP BY time()的條件下與聚合函數嵌套使用,格式如下:

SELECT DERIVATIVE(AGGREGATION_FUNCTION(<field_key>),[<unit>]) FROM <measurement_name> WHERE <stuff> GROUP BY time(<aggregation_interval>)

 

下面的例子六個觀測值的water_level在表h2o_feet設置tag為 santa_monica:

name: h2o_feet
--------------
time			               water_level
2015-08-18T00:00:00Z	 2.064
2015-08-18T00:06:00Z	 2.116
2015-08-18T00:12:00Z	 2.028
2015-08-18T00:18:00Z	 2.126
2015-08-18T00:24:00Z	 2.041
2015-08-18T00:30:00Z	 2.051

例子1
計算每秒鍾的變化率
SELECT DERIVATIVE(water_level) FROM h2o_feet WHERE location = 'santa_monica' LIMIT 5
結果
name: h2o_feet
--------------
time			              derivative
2015-08-18T00:06:00Z	 0.00014444444444444457
2015-08-18T00:12:00Z	 -0.00024444444444444465
2015-08-18T00:18:00Z	 0.0002722222222222218
2015-08-18T00:24:00Z	 -0.000236111111111111
2015-08-18T00:30:00Z	 2.777777777777842e-05
注意,derivative中的第一個字段值(0.00014)不是0.052(原始數據中前兩個字段值之間的差異:2.116 - 2.604=0.052)。因為查詢不指定單元的選擇,InfluxDB自動計算每一秒的變化率,而不是每六分鍾的變化率。導數列中第一個值的計算如下所示:(2.116 - 2.064) / (360s / 1s)
分子是按字段值之間的差異。分母是以秒計的相關時間戳之間的差異(2015-08-18t00:06:00z - 2015-08-18t00:00:00z = 360s)除以單位(1s),從2015-08-18t00:00:00z率2015-08-18t00:06:00z返回
每秒的變化率。

例子2
計算每六分鍾的變化率

SELECT DERIVATIVE(water_level,6m) FROM h2o_feet WHERE location = 'santa_monica' LIMIT 5
結果
name: h2o_feet -------------- time derivative 2015-08-18T00:06:00Z 0.052000000000000046 2015-08-18T00:12:00Z -0.08800000000000008 2015-08-18T00:18:00Z 0.09799999999999986 2015-08-18T00:24:00Z -0.08499999999999996 2015-08-18T00:30:00Z 0.010000000000000231

解釋:
數列中第一個值的計算如下所示:
(2.116 - 2.064 / (6m / 12m)
分子是按字段值之間的差異。分母是分鍾相關的時間戳之間的差異(2015-08-18t00:06:00z - 2015-08-18t00:00:00z = 6m)除以單位(12m)。這將改變每12分鍾從2015-08-18t00:00:00z率2015-08-18t00:06:00z。
注:指定12m為單位並不意味着InfluxDB計算的數據每12分鍾間隔的變化率。相反,InfluxDB計算每個區間的有效數據每12分鍾變化率。
例子3
計算每12分鍾間隔最大值每秒的變化率
SELECT DERIVATIVE(MAX(water_level)) FROM h2o_feet WHERE location = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time < '2015-08-18T00:36:00Z' GROUP BY time(12m)
結果:
name: h2o_feet -------------- time derivative 2015-08-18T00:12:00Z 0.009999999999999787 2015-08-18T00:24:00Z -0.07499999999999973
解釋:
為了得到這些結果,第一集InfluxDB計算區間指定組中的time()條款的時間max() water_level數據(12m)。這些結果看是這樣
name: h2o_feet
--------------
time			               max
2015-08-18T00:00:00Z	 2.116
2015-08-18T00:12:00Z	 2.126
2015-08-18T00:24:00Z	 2.051

其次,計算每12m InfluxDB變化率(相同的時間間隔作為集團的time()區間)在派生列得到的結果。導數列中第一個值的計算如下所示:(2.126 - 2.116) / (12m / 12m)

分子是按字段值之間的差異。分母是分鍾相關的時間戳之間的差異(2015-08-18t00:12:00z - 2015-08-18t00:00:00z=12m)除以單位(12m)。這個回報率每12分鍾改變匯總數據從2015-08-18t00:00:00z到2015-08-18t00:12:00z。

例子4
  將數據聚合到18分鍾間隔,計算每六分鍾的變化率。

SELECT DERIVATIVE(SUM(water_level),6m) FROM h2o_feet WHERE location = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time < '2015-08-18T00:36:00Z' GROUP BY time(18m)

結果:

name: h2o_feet
--------------
time			               derivative
2015-08-18T00:18:00Z	 0.0033333333333332624

解釋:
為了得到這些結果,第一集InfluxDB計算區間指定組中的time()條款的時間water_level的sum()數據(18m)。聚合結果如下所示
name: h2o_feet
--------------
time			               sum
2015-08-18T00:00:00Z	 6.208
2015-08-18T00:18:00Z	 6.218

其次,計算出每單位InfluxDB變化率(6m)在派生列得到的結果。導數列中第一個值的計算如下所示:(6.218 - 6.208) / (18m / 6m)
分子是按字段值之間的差異。分母是分鍾相關的時間戳之間的差異(2015-08-18t00:18:00z - 2015-08-18t00:00:00z = 18m)除以單位(6m)。這個返回的匯總數據2015-08-18t00:00:00z到2015-08-18t00:18:00z的每六分鍾的變化率。

2、DIFFERENCE()函數

作用:返回一個字段中連續的時間值之間的差異。字段類型必須是長整型或float64。

最基本的語法:

SELECT DIFFERENCE(<field_key>) FROM <measurement_name> [WHERE <stuff>]

與GROUP BY time()以及其他嵌套函數一起使用的語法格式:

SELECT DIFFERENCE(<function>(<field_key>)) FROM <measurement_name> WHERE <stuff> GROUP BY time(<time_interval>)

其中,函數可以包含以下幾個:

COUNT()MEAN()MEDIAN(),SUM()FIRST()LAST()MIN()MAX(), 和 PERCENTILE()。

下面的例子集中在2015-08-18t00:00:00z和2015-08-18t00:36:00z之間santa_monica現場water_level:

> SELECT water_level FROM h2o_feet WHERE location='santa_monica' AND time >= '2015-08-18T00:00:00Z' and time <= '2015-08-18T00:36:00Z'
name: h2o_feet
--------------
time			  water_level
2015-08-18T00:00:00Z	  2.064
2015-08-18T00:06:00Z	  2.116
2015-08-18T00:12:00Z	  2.028
2015-08-18T00:18:00Z	  2.126
2015-08-18T00:24:00Z	  2.041
2015-08-18T00:30:00Z	  2.051
2015-08-18T00:36:00Z	  2.067

例子1
計算water_level之間值的差異:
SELECT DIFFERENCE(water_level) FROM h2o_feet WHERE location='santa_monica' AND time >= '2015-08-18T00:00:00Z' and time <= '2015-08-18T00:36:00Z'

結果:
name: h2o_feet
--------------
time			                difference
2015-08-18T00:06:00Z	  0.052000000000000046
2015-08-18T00:12:00Z	  -0.08800000000000008
2015-08-18T00:18:00Z	  0.09799999999999986
2015-08-18T00:24:00Z	  -0.08499999999999996
2015-08-18T00:30:00Z	  0.010000000000000231
2015-08-18T00:36:00Z	  0.016000000000000014
解釋:
差異列中的第一個值是2.116 - 2.064,差值列中的第二個值為2.028 - 2.116。
請注意,小數點的額外位置是浮點數不准確的結果。因為數據類型都為float類型。
例子2
選擇每12分鍾間隔最小的water_level值計算這些值之間的差異:
SELECT DIFFERENCE(MIN(water_level)) FROM h2o_feet WHERE location='santa_monica' AND time >= '2015-08-18T00:00:00Z' and time <= '2015-08-18T00:36:00Z' GROUP BY time(12m)
結果:
name: h2o_feet -------------- time difference 2015-08-18T00:12:00Z -0.03600000000000003 2015-08-18T00:24:00Z 0.0129999999999999 2015-08-18T00:36:00Z 0.026000000000000245
解釋:
在不同列中得到值,InfluxDB首先選擇min()值每隔12分鍾:
> SELECT MIN(water_level) FROM h2o_feet WHERE location='santa_monica' AND time >= '2015-08-18T00:00:00Z' and time <= '2015-08-18T00:36:00Z' GROUP BY time(12m)
name: h2o_feet
--------------
time			 min
2015-08-18T00:00:00Z  	2.064
2015-08-18T00:12:00Z  	2.028
2015-08-18T00:24:00Z  	2.041
2015-08-18T00:36:00Z  	2.067

然后使用這些值計算時間順序值之間的差值;差值列中的第一個值是2.028 - 2.064。

3、ELAPSED()函數

作用:返回一個字段在連續的時間間隔間的差異,間隔單位可選,默認為1納秒。

單位可選項如下圖:

語法:

SELECT ELAPSED(<field_key>, <unit>) FROM <measurement_name> [WHERE <stuff>]

例子1: 

計算差值(納秒)的領域h2o_feet之間的時間戳:

SELECT ELAPSED(water_level) FROM h2o_feet WHERE location = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' and time <= '2015-08-18T00:24:00Z'
結果
name: h2o_feet
--------------
time			  elapsed
2015-08-18T00:06:00Z	  360000000000
2015-08-18T00:12:00Z	  360000000000
2015-08-18T00:18:00Z	  360000000000
2015-08-18T00:24:00Z	  360000000000

例子2
在計算領域h2o_feet之間的時間間隔一分鍾數:
SELECT ELAPSED(water_level,1m) FROM h2o_feet WHERE location = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' and time <= '2015-08-18T00:24:00Z'
結果
name: h2o_feet
--------------
time			  elapsed
2015-08-18T00:06:00Z	  6
2015-08-18T00:12:00Z	  6
2015-08-18T00:18:00Z	  6
2015-08-18T00:24:00Z	  6
注意:如果設置的時間間隔比字段數據間的時間間隔更大時,則函數會返回0,如下所示:
> SELECT ELAPSED(water_level,1h) FROM h2o_feet WHERE location = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' and time <= '2015-08-18T00:24:00Z'
name: h2o_feet
--------------
time			                elapsed
2015-08-18T00:06:00Z	  0
2015-08-18T00:12:00Z	  0
2015-08-18T00:18:00Z	  0
2015-08-18T00:24:00Z	  0

4、MOVING_AVERAGE()函數

作用:返回一個連續字段值的移動平均值,字段類型必須是長整形或者float64類型。

語法:

基本語法

SELECT MOVING_AVERAGE(<field_key>,<window>) FROM <measurement_name> [WHERE <stuff>]

與其他函數和GROUP BY time()語句一起使用時的語法

SELECT MOVING_AVERAGE(<function>(<field_key>),<window>) FROM <measurement_name> WHERE <stuff> GROUP BY time(<time_interval>)

此函數可以和以下函數一起使用:

COUNT()MEAN(),MEDIAN()SUM()FIRST()LAST()MIN()MAX(), and PERCENTILE().

下面的例子water_level在表 h2o_feet,location 為santa_monica,時間段2015 - 08 - 18 - t00:00:00z和2015 - 08 - 18 - t00:36:00z:

> SELECT water_level FROM h2o_feet WHERE location = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' and time <= '2015-08-18T00:36:00Z'
name: h2o_feet
--------------
time			  water_level
2015-08-18T00:00:00Z	  2.064
2015-08-18T00:06:00Z	  2.116
2015-08-18T00:12:00Z	  2.028
2015-08-18T00:18:00Z	  2.126
2015-08-18T00:24:00Z	  2.041
2015-08-18T00:30:00Z	  2.051
2015-08-18T00:36:00Z	  2.067
例子1:
計算移動平均在每2字段值:

SELECT MOVING_AVERAGE(water_level,2) FROM h2o_feet WHERE location = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' and time <= '2015-08-18T00:36:00Z'

結果:
name: h2o_feet
--------------
time			 moving_average
2015-08-18T00:06:00Z	  2.09
2015-08-18T00:12:00Z	  2.072
2015-08-18T00:18:00Z	  2.077
2015-08-18T00:24:00Z	  2.0835
2015-08-18T00:30:00Z	  2.0460000000000003
2015-08-18T00:36:00Z	  2.059

解釋
移動平均線列中的第一個值的平均值是2.064和2.116,第二個移動平均線列中的值是2.116和2.028的平均水平。

例子2
  • 每隔12分鍾選擇最低值water_level和計算移動平均每2字段值:
SELECT MOVING_AVERAGE(MIN(water_level),2) FROM h2o_feet WHERE location = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' and time <= '2015-08-18T00:36:00Z' GROUP BY time(12m)
結果:
name: h2o_feet
--------------
time			                moving_average
2015-08-18T00:12:00Z	  2.0460000000000003
2015-08-18T00:24:00Z	  2.0345000000000004
2015-08-18T00:36:00Z	  2.0540000000000003
解釋:
這些結果,InfluxDB首先選擇MIN() water_level每12分鍾間隔:
name: h2o_feet
--------------
time			   min
2015-08-18T00:00:00Z	  2.064
2015-08-18T00:12:00Z	  2.028
2015-08-18T00:24:00Z	  2.041
2015-08-18T00:36:00Z	  2.067
然后使用這些值來計算移動平均在每2字段值,移動平均線列中的第一個結果的平均值2.064和2.028,第二個結果是2.028和2.041的平均水平。

5、NON_NEGATIVE_DERIVATIVE()函數

作用:返回在一個series中的一個字段中值的變化的非負速率。

InfluxDB計算連續字段值之間的差異和轉換的結果為每單位變化率。
單位參數是可選的,如果沒有指定,則默認為1秒(1s)。

語法:

SELECT NON_NEGATIVE_DERIVATIVE(<field_key>, [<unit>]) FROM <measurement_name> [WHERE <stuff>]
其中unit取值可以為以下幾個:

non_negative_derivative()也可以與嵌套函數a GROUP BY time()一起使用。 

查詢包含這些選項,InfluxDB首先進行聚合,選擇,或轉型通過時間間隔函數group by time()。

然后計算時間字段值之間的差異,並將這些結果轉換為每單位的變化率。
單元參數是可選的,如果沒有指定,默認為相同的時間間隔作為集團的time()區間。

與聚合類函數放在一起使用時的語法如下所示:

SELECT NON_NEGATIVE_DERIVATIVE(AGGREGATION_FUNCTION(<field_key>),[<unit>]) FROM <measurement_name> WHERE <stuff> GROUP BY time(<aggregation_interval>)

可以參考derivative()的查詢例子。derivative()和non_negative_derivative所有的查詢結果是相同的除了non_negative_derivative()只返回正數。

6、STDDEV()函數

作用:返回一個字段中的值的標准偏差。值的類型必須是長整型或float64類型

語法:

SELECT STDDEV(<field_key>) FROM <measurement_name> [WHERE <stuff>] [GROUP BY <stuff>]

例子1
計算表h20_feet 中字段water_level的標准偏差
SELECT STDDEV(water_level) FROM h2o_feet
結果:
name: h2o_feet
--------------
time			               stddev
1970-01-01T00:00:00Z	 2.279144584196145
例子2
計算water_level在一個星期時間間隔和location 標簽,2015年9月18日的午夜2015年8月18日中午之間標准偏差。
SELECT STDDEV(water_level) FROM h2o_feet WHERE time >= '2015-08-18T00:00:00Z' and time < '2015-09-18T12:06:00Z' GROUP BY time(1w), location
結果:
name: h2o_feet
tags: location = coyote_creek
time			 stddev
----			  ------
2015-08-13T00:00:00Z	 2.2437263080193985
2015-08-20T00:00:00Z	 2.121276150144719
2015-08-27T00:00:00Z	 3.0416122170786215
2015-09-03T00:00:00Z	 2.5348065025435207
2015-09-10T00:00:00Z	 2.584003954882673
2015-09-17T00:00:00Z	 2.2587514836274414

name: h2o_feet
tags: location = santa_monica
time			  stddev
----			  ------
2015-08-13T00:00:00Z	 1.11156344587553
2015-08-20T00:00:00Z	 1.0909849279082366
2015-08-27T00:00:00Z	 1.9870116180096962
2015-09-03T00:00:00Z	 1.3516778450902067
2015-09-10T00:00:00Z	 1.4960573811500588
2015-09-17T00:00:00Z	 1.075701669442093

 

 
 
            
 
 



免責聲明!

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



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