Моделирование притока данных в теги и поля
TL;DR
Как смоделировать данные в поля по сравнению с тегами, если вы хотите выполнить как по группам, так и по числу
Итак, в настоящее время это моя модель данных Infliff:
api_requests (database)
- requests_stats (measurement)
- api_path (tag)
- app_version (tag)
- host (tag)
- platform (tag)
- account_id (field)
- user_id (field)
- function_name (field)
- network (field)
- network_type (field)
- time_to_execute (field)
Итак, теперь я хочу узнать количество отдельных учетных записей (активных учетных записей). Поэтому я могу выполнить следующий запрос:
SELECT count(distinct("account_id")) AS "active_accounts"
FROM "api_requests"."autogen"."requests_stats"
Это прекрасно работает, так как идентификатор учетной записи является полем.
Теперь предположим, что я хочу выполнить группирование по операции с account_id, например, чтобы найти количество запросов, полученных на один аккаунт:
SELECT count("function_name") AS "request_count"
FROM "api_requests"."autogen"."requests_stats"
GROUP BY "account_id"
Я не могу сделать это, так как группа по рекомендуется для тегов.
Как справиться с этим видом сценария?
Одним из решений является сохранение значения как в поле, так и в значении, но это будет избыточность данных.
Другим и наиболее оптимальным способом было бы использовать count (Different()) для работы с тегами. Это возможно? Это было на самом деле запросом функции в их репозитории github.
Или можно что-то сделать с моделью данных для достижения того же?
1 ответ
Использование tag
за account_id
, Вместо подсчета запросов:
SELECT count(distinct("account_id")) AS "active_accounts"
FROM "api_requests"."autogen"."requests_stats"
используйте запрос, который вычислит точное количество значений тега:
SHOW TAG VALUES EXACT CARDINALITY WITH KEY = "account_id"
Это будет работать только для вашего варианта использования, потому что вы не хотите использовать какой-либо дополнительный фильтр (время, тег) в вашем отдельном запросе подсчета.