Когда я запрашиваю и делаю шаг, используя make-series, я могу выбрать пошаговый (1 час) день (1 день), но как мне справиться, когда я хочу, чтобы шаг был в месяц? (1м) кажется в минуту
Мой запрос выглядит так
let _timePeriodInHours = abs(datetime_diff('hour', _startTime, _endTime));
let _stepConfig = case(_timePeriodInHours <= 24, timespan(1h), _timePeriodInHours <= 744, timespan(1d), timespan(30d));
tilldevicedata
| where todatetime(TransactionTimeStampUtc) between (_startTime.._endTime)
| where Brand has_any (_brand)
| where Country == _country
| where Store has_any (_store)
| make-series TotalDiscounts = sum(TransactionValueDiscount), TotalSales = sum(TransactionValueNet) default = 0 on todatetime(TransactionTimeStampUtc) step _stepConfig
Идея состоит в том, чтобы иметь график за месяц, если пользователь выбирает интервал более 31 дня в селекторе dateTime, но это кажется невозможным, он отлично работает для часа и дня, но как только я передаю 744 часа в переменной _timePeriodInHours, stepCOnfig становится 30d, который на самом деле не соответствует месяцу, а также выглядит странно, потому что заканчивается графиком, показывающим время вместо месяца.
Как я могу обрабатывать группировку по месяцам, когда пользователь выбирает более 744 часов, а stepConfig должен быть 1M = 1 месяц?
----- РЕДАКТИРОВАТЬ -----
Почти готово
ПОСЛЕДНИЕ 24 ЧАСА
Это отлично работает, учитывая приведенное ниже решение, посмотрите, как часы выглядят нормально, как в 18:00, 19:00 и т. д.
ПОСЛЕДНИЕ 14 дней Используя последние 14 дней, это также выглядит хорошо, обратите внимание, что месяц и т. д. Хорошо распределены.
Теперь вот странные части, если я выберу последние 12 часов, обратите внимание, что время больше не отображается красиво, поскольку 18:00 добавляет миллисекунды и т. д. и выглядит совершенно странно.
И самый странный из них — это последние 60 дней, которые выглядят совершенно абсурдно со странной отметкой времени?
В настоящее время запрос выглядит так
let _timePeriod = _endTime - _startTime;
let _stepConfig = case(_timePeriod <= 24h, 1h, 1d);
tilldevicedata
| extend dttm = todatetime(TransactionTimeStampUtc)
| where dttm between (_startTime.._endTime)
| where Brand has_any (_brand)
| where Country == _country
| where Store has_any (_store)
| make-series TotalDiscounts = sum(TransactionValueDiscount) default = 0, TotalSales = sum(TransactionValueNet) default = 0 on dttm = case(_timePeriod <= 744h, dttm, startofmonth(dttm)) step _stepConfig
| mv-apply TotalDiscounts, TotalSales, dttm to typeof(datetime) on (where _timePeriod <= 744h or dttm == startofmonth(dttm)
| summarize make_list(TotalSales), make_list(dttm))
| render timechart





Здесь нет временного промежутка «месяц», поэтому здесь требуются некоторые хитрости.
Хотя это можно довольно легко решить, используя summarize вместо make-series, при этом мы теряем основное преимущество make-series, заключающееся в заполнении пробелов недостающими данными.
Поэтому вот решение на основе make-series.
Главный трюк здесь заключается в том, чтобы использовать make-series с шагом 1d для ежемесячного отчета, для данных, которые уже были сгруппированы по месяцам (это достигается с помощью make-series ... on ... startofmonth(dttm)...), и после этого сохранять данные только за 1-е число каждого месяца.
// Generation of a data sample. Not part of the solution.
let tilldevicedata = materialize(range i from 1 to 1000000 step 1 | extend dttm = ago(365d*rand()) | where dttm !between (ago(5h) .. 3h) and dttm !between (ago(7d) .. 3d));
// The solution starts here.
let _startTime = ago(600d);
let _endTime = now();
let _timePeriod = _endTime - _startTime;
let _stepConfig = case(_timePeriod <= 24h, 1h, 1d);
tilldevicedata
| make-series count() on dttm = case(_timePeriod <= 744h, dttm, startofmonth(dttm)) from bin(_startTime, _stepConfig) to _endTime step _stepConfig
| mv-apply count_, dttm to typeof(datetime) on (where _timePeriod <= 744h or dttm == startofmonth(dttm) | summarize make_list(count_), make_list(dttm))
| render timechart
_startTime = назад (600 дней)
_startTime = назад (15 дней)
_startTime = назад (21 час)
Будьте осторожны со своими желаниями ?
Не уверен, почему у меня возникают проблемы в 2 из 4 вариантов использования, он отлично работает, но, похоже, ломается в двух случаях.
Возможно, у вас нет данных за запрошенный период
Вы можете видеть, что за последние 12 часов у меня есть данные, но они по-прежнему показывают только одну точку и не дополняются нулями, а также отметка времени выглядит так странно, что я не понимаю, и точно за 60 дней у меня есть данные, так как они работают в течение 14 дней, или я вас неправильно понимаю? временная метка на 60 дней выглядит совершенно странно, не так ли? Я ожидал, что там будет что-то майское или хотя бы что-то с указанием месяца?
Мой плохой, быстро исправить.
Готово. from и to следует использовать в make-series, чтобы отразить желаемый диапазон, или он определяется фактическими данными и может вызвать проблемы в случае отсутствия данных. Обратите внимание, что пункт where для фильтрации периода больше не нужен и был удален. Кроме того, start должен быть привязан к 1d, чтобы ежемесячный отчет работал, и желательно, чтобы ежедневный отчет также был привязан к 1d, а почасовой отчет должен быть привязан к 1h
Готово. from и to следует использовать в make-series, чтобы отразить желаемый диапазон, или он определяется фактическими данными и может вызвать проблемы в случае отсутствия данных. Обратите внимание, что пункт where для фильтрации периода больше не нужен и был удален. Кроме того, start должен быть привязан к 1d, чтобы ежемесячный отчет работал, и желательно, чтобы ежедневный отчет также был привязан к 1d, а почасовой отчет должен быть привязан к 1h для более приятного представления.
Если бы я мог проголосовать 1000 раз, я бы действительно не знал, как полностью выразить свою благодарность здесь, я действительно многому научился, и я очень ценю это
Не за что :-)
Небольшое упрощение кода: from bin(_startTime, _stepConfig)
OMG lol хорошо, это займет некоторое переваривание