Как сгруппировать результаты за месяц, если есть оператор за месяц?

Когда я запрашиваю и делаю шаг, используя 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 добавляет миллисекунды и т. д. и выглядит совершенно странно.

ПОСЛЕДНИЕ 12 часовКак сгруппировать результаты за месяц, если есть оператор за месяц?

И самый странный из них — это последние 60 дней, которые выглядят совершенно абсурдно со странной отметкой времени?

ПОСЛЕДНИЕ 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
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь нет временного промежутка «месяц», поэтому здесь требуются некоторые хитрости.
Хотя это можно довольно легко решить, используя 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 дней)

Monthly

Повседневная

_startTime = назад (15 дней)

Daily

Ежечасно

_startTime = назад (21 час)

Hourly

OMG lol хорошо, это займет некоторое переваривание

Matt Douhan 15.05.2022 14:11

Будьте осторожны со своими желаниями ?

David דודו Markovitz 15.05.2022 14:13

Не уверен, почему у меня возникают проблемы в 2 из 4 вариантов использования, он отлично работает, но, похоже, ломается в двух случаях.

Matt Douhan 15.05.2022 14:52

Возможно, у вас нет данных за запрошенный период

David דודו Markovitz 15.05.2022 14:56

Вы можете видеть, что за последние 12 часов у меня есть данные, но они по-прежнему показывают только одну точку и не дополняются нулями, а также отметка времени выглядит так странно, что я не понимаю, и точно за 60 дней у меня есть данные, так как они работают в течение 14 дней, или я вас неправильно понимаю? временная метка на 60 дней выглядит совершенно странно, не так ли? Я ожидал, что там будет что-то майское или хотя бы что-то с указанием месяца?

Matt Douhan 15.05.2022 15:00

Мой плохой, быстро исправить.

David דודו Markovitz 15.05.2022 15:04

Готово. from и to следует использовать в make-series, чтобы отразить желаемый диапазон, или он определяется фактическими данными и может вызвать проблемы в случае отсутствия данных. Обратите внимание, что пункт where для фильтрации периода больше не нужен и был удален. Кроме того, start должен быть привязан к 1d, чтобы ежемесячный отчет работал, и желательно, чтобы ежедневный отчет также был привязан к 1d, а почасовой отчет должен быть привязан к 1h

David דודו Markovitz 15.05.2022 15:19

Готово. from и to следует использовать в make-series, чтобы отразить желаемый диапазон, или он определяется фактическими данными и может вызвать проблемы в случае отсутствия данных. Обратите внимание, что пункт where для фильтрации периода больше не нужен и был удален. Кроме того, start должен быть привязан к 1d, чтобы ежемесячный отчет работал, и желательно, чтобы ежедневный отчет также был привязан к 1d, а почасовой отчет должен быть привязан к 1h для более приятного представления.

David דודו Markovitz 15.05.2022 15:26

Если бы я мог проголосовать 1000 раз, я бы действительно не знал, как полностью выразить свою благодарность здесь, я действительно многому научился, и я очень ценю это

Matt Douhan 15.05.2022 15:26

Не за что :-)

David דודו Markovitz 15.05.2022 15:27

Небольшое упрощение кода: from bin(_startTime, _stepConfig)

David דודו Markovitz 15.05.2022 15:42

Другие вопросы по теме