由于有 month 运算符,如何每月对结果进行分组?

How to group results per month since there is operator for month?

当我使用 make-series 查询和步进时,我可以选择按小时 (1h) 天 (1d) 步进,但是当我希望步进是每月时如何处理? (1m) 好像是每分钟

我的查询如下所示

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

如果用户 select 在日期时间选择器中相隔超过 31 天,我的想法是每个月都有图表,但这似乎不太可能,它在一小时和一天都可以正常工作,但只要我在 _timePeriodInHours 变量中传递 744 小时,stepCOnfig 变为 30d whcih 对于月份来说并不正确,而且它看起来也很奇怪,因为它最终以图表显示时间而不是月份

当用户 select 超过 744 小时且 stepConfig 应为 1M = 1 个月时,如何处理每月分组?

----- 编辑 -----

快到了

最后 24 小时

鉴于下面的解决方案,这工作正常,看看时间如何看起来正常,如 18:00 19:00 等

最近 14 天 使用过去 14 天这看起来也不错注意月份等很好地传播

现在奇怪的部分来了,如果我 select 持续了 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

没有“月”的时间跨度,所以这里需要一些技巧。
虽然这可以通过使用 summarize 而不是 make-series 很容易地解决,但这样做我们失去了 make-series 的主要优势,即缺失数据的间隙填充。
因此,这里有一个基于make-series.

的解决方案

这里的主要技巧是对月度报告使用 make-series1d 步骤,对于已经按月 分组的数据(这是通过使用 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

Fiddle

每月

_startTime = 前(600 天)

每天

_startTime = 前(15d)

每小时

_startTime = 前(21 小时)