2016-02-19 10 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 баллов будут 1 балл со значением результата (5 + 10 + 5 + 10 + 5)/5.

Это не дает результатов для меня, для ясности, поскольку это всего лишь счет, и я после среднего.

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) 

В моем фактическом использовании "идентификатор" является string (содержимое, а не тег, потому что счетчик не поддерживается для тегов в моей версии InfluxDB).

ответ

1

Чтобы уточнить несколько пунктов для читателей, в InfluxQL, функции, такие как COUNT() и DISTINCT(), могут принимать только поля, а не теги. Кроме того, в то время как поддерживает вложение функции 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 минуту результаты COUNT в main_1m_count:

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

(Обратите внимание, что by default, InfluxDB использует epoch 0 и now(), как нижняя и верхние границы диапазона времени, поэтому избыточно включать and time < now() в пункт WHERE.)

Смежные вопросы