2016-02-19 193 views
1

使用DB潮V0.9,說我有這個簡單的查詢:InfluxDB平均隨着時間的推移

select count(distinct("id")) FROM "main" WHERE time > now() - 30m and time < now() GROUP BY time(1m) 

其中給出類似的結果:

08:00 5 
08:01 10 
08:02 5 
08:03 10 
08:04 5 

現在我想產生一個查詢平均值爲5分鐘以上。所以積分現在相隔5分鐘,而不是1分鐘,而是1分鐘數值的平均值。因此,上述5點將是(5 + 10 + 5 + 10 + 5)/ 5的結果的值爲1分。

爲了清晰起見,這並不會產生我所追求的結果,因爲這只是一個計數,而我是在平均水平之後。

select count(distinct("id")) FROM "main" WHERE time > now() - 30m and time < now() GROUP BY time(5m) 

這不起作用(給出錯誤):

select mean(distinct("id")) FROM "main" WHERE time > now() - 30m and time < now() GROUP BY time(5m) 

也不起作用(提示錯誤):

select mean(count(distinct("id"))) FROM "main" WHERE time > now() - 30m and time < now() GROUP BY time(5m) 

在我的實際使用情況 「ID」 是字符串(內容,而不是標籤,因爲在我的InfluxDB版本中,標記數不同,不支持)。

回答

1

爲了闡明讀者的幾點,在InfluxQL中,像COUNT()DISTINCT()這樣的函數只能接受字段,而不能接受字段。另外,雖然COUNT()支持嵌套DISTINCT()函數,但大多數嵌套或子函數尚不支持。另外,不支持嵌套查詢,子查詢或存儲過程。

但是,有一種方法可以解決您使用連續查詢的需要,這種方法可以自動處理數據並將這些結果寫回數據庫。

首先把您的原始查詢,並使其成爲continuous query(CQ)。

CREATE CONTINUOUS QUERY count_foo ON my_database_name BEGIN SELECT COUNT(DISTINCT("id")) AS "1m_count" INTO main_1m_count FROM "main" GROUP BY time(1m) END

有對CQ其他選項,但基本一會醒來的每一分鐘,計算COUNT(DISTINCT("id"))對於現有分鐘,然後將該結果存儲在一個新的測量,main_1m_count

現在,你可以很容易地計算出的5張分鐘也可預先1算出分鐘計數結果平均計數在main_1m_count

SELECT MEAN("1m_count") FROM main_1m_count WHERE time > now() - 30m GROUP BY time(5m)

(注意by default,InfluxDB使用epoch 0now()爲低,上限時間範圍邊界,因此在WHERE條款中包含and time < now()是多餘的。)

相關問題