Сумма дополнительных запросов в Influxdb - сумма средних значений - PullRequest
0 голосов
/ 14 июля 2020

Я создаю панель инструментов для всего портфолио с infxdb и grafana, и у меня возникает следующая проблема при суммировании моего вспомогательного портфеля ios:

enter image description here

Aka some of the values are getting doubled for no reason at all. The scraper I use to get data from websites runs once per hour. I have checked the data at visible times and they were not uploaded to database twice. (all group by timeframes are problematic) The solution could be summing averages for all assets by hour, which works completely ok:

введите описание изображения здесь

Моя таблица Infxdb имеет следующую структуру:

    time                              Amount    CZK_amount     Currency Portfolio
0  2020-07-11T00:01:07.386426Z         xxxxx Kč XXXXXXX.350000    CZK    Portu
1  2020-07-11T00:01:07.424887Z         $xxxxx   XXXXXX.614056     USD    Crypto
2  2020-07-11T00:01:07.435219Z         €xxxx    XXXXX.299440      EUR    Degiro
3  2020-07-11T00:01:07.447881Z          xxxx    XXXXX.000000      CZK    Zonky

В настоящее время мой запрос на вычисление среднего для одного портфеля по часам выглядит следующим образом:

SELECT mean("CZK_amount") FROM "autogen"."Portfolio_status" WHERE ("Portfolio" = 'Crypto') AND $timeFilter GROUP BY time(1h) fill(linear)

Есть ли способ написать запрос, который возвращал бы результат суммы всех портфелей ios?

SELECT mean("CZK_amount") FROM "autogen"."Portfolio_status" WHERE ("Portfolio" = 'Portu') AND $timeFilter GROUP BY time(1h) fill(linear)

SELECT mean("CZK_amount") FROM "autogen"."Portfolio_status" WHERE ("Portfolio" = 'Zonky') AND $timeFilter GROUP BY time(1h) fill(linear)

SELECT mean("CZK_amount") FROM "autogen"."Portfolio_status" WHERE ("Portfolio" = 'Degiro') AND $timeFilter GROUP BY time(1h) fill(linear)

Спасибо за любую информацию.

1 Ответ

1 голос
/ 14 июля 2020

Я бы использовал подзапрос и группировку по тегу:

SELECT SUM(mean) FROM (
   SELECT MEAN("CZK_amount") 
   FROM "autogen"."Portfolio_status" 
   WHERE ("Portfolio" = 'Portu') OR ("Portfolio" = 'Degiro') 
     AND $timeFilter 
   GROUP BY time(1h), "Portfolio" fill(linear)
) GROUP BY time(1h) fill(linear)

Кстати: у вас есть пики, потому что вы группируете по минутам, и у вас может не быть регулярного 1-минутного интервала в данных, например:

    time                              Amount    CZK_amount     Currency Portfolio
0  2020-07-11T00:01:07.386426Z         xxxxx Kč XXXXXXX.350000    CZK    Portu
0  2020-07-11T00:02:47.386426Z         xxxxx Kč XXXXXXX.350000    CZK    Portu
0  2020-07-11T00:04:01.386426Z         xxxxx Kč XXXXXXX.350000    CZK    Portu
0  2020-07-11T00:04:59.386426Z         xxxxx Kč XXXXXXX.350000    CZK    Portu
...

Таким образом, значение 3-й минуты будет равно нулю, а значение 4-й минуты будет удвоено для этих данных.

...