которая прореживается с помощью ttl GROUP BY, в нем делаю SET requests = countMergeState(requests), но хочется получить не сумму, например за час, а среднее значение за этот час, как это можно сделать? Получается нужен некий avg в момент ttl group by?
Заранее спасибо за ответ
https://www.perplexity.ai/search/5808c06d-b972-495c-aaae-ac0a5cf28731?s=u https://kb.altinity.com/altinity-kb-queries-and-syntax/ttl/ttl-group-by-examples/
-Merge сделайте
У меня же AggregateFunction(count), а не avg, на нее нельзя avgMerge делать
avg(countMerge(count)) ?
Aggregate function countMerge(requests) is found inside another aggregate function in query: While processing countMerge(requests)
=( опс, а просто avg(countField) тоже ошибку возвращает?
Illegal type AggregateFunction(count, UInt64) of argument for aggregate function avg
а вот так? avg(finalizeAggregation(count))
Хм, я наверно вообще не так задал вопрос... У меня есть табличка AggregatingMergeTree с колонкой requests AggregateFunction(count), которую я делю на минуту (в запросе countMerge(requests)/60, чтобы получить RPS. Также в этой табличке есть ttl GROUP BY, который в SET делает requests = countMergeState(requests), но получается его уже нельзя делить на минуту, его надо делить на временной интервал, как это более правильно сделать? Есть идея завести отдельную колонку с дефолтным значением 60 и при set менять его на другие интервалы
ну у вас TTL ... GROUP BY ... SET count=avg(finalizeAggregation(count)) ? и не работает?
да, идея норм. но вам надо как то интервал посчитать тогда
Что если попробовать взять MIN и MAX времени в диапазоне и посчитать разницу — это и будет ваш временной диапазон, на который делить. Дальше получаете коэффициент от разницы минуты к вашей получившейся: (60 / ваша разница) * countMerge(requests) = сколько примерно в минуту?
Conversion from Float64 to AggregateFunction(count, UInt64) is not supported: While processing _CAST(avg(finalizeAggregation(requests)), 'AggregateFunction(count, UInt64)').
в плане? я делаю получается в ttl GROUP BY set time = toStartOfHour(time) и для большего интервала toStartOfInterval(time, interval 6 hour)
немного не понял о каком диапазоне тут идет речь
так покажите полный CREATE TABLE на fiddle? откуда у вас requests взялся ? если вы собираетесь count усреднять?
ну если работает. то все ок
Насколько я понял, вы группируете записи по минуте, чтобы потом посчитать RPS в минуту. Так что и диапазон является минутой. Но если у вас нет данных за всю минуту, а есть только какая-то их часть внутри минуты, то описанным выше способом можно получить примерные данные внутри минуты используя лишь её часть. Возможно, я неверно понял вашу задачу
https://xpaste.pro/p/J78L5MnZ
ну да, если добавить колонку, то потом ее можно использовать в SELECT и обновлять в GROUP BY ...
Спасибо, но мне немного другое нужно было)
Была идея сделать как-то так https://xpaste.pro/p/tiGxOImh но нет, не дает :( в момент optimize final - Not found column 3600 in block. There are only columns: platform, requests, rollup_interval, event_time Пробовал делать умножение rollup_interval, но тоже не дает (ошибка такая же) Есть ли еще какие-то идеи решения? Может RPS как-то по другому хранить?
min(arrayMin([3600])) вот так попробуйте как workaround https://fiddle.clickhouse.com/907d58e4-2fa9-4795-9c74-e40dddafaa27
😐🖐🏻 min(arrayMin([3600])) вот так попробуйте как workaround https://fiddle.clickhouse.com/907d58e4-2fa9-4795-9c74-e40dddafaa27
Not found column [3600] in block. :( видимо вообще самому значение там нельзя сетить, жуть выглядит так, что я как-то совсем не так как надо клик использую
Обсуждают сегодня