由于有 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-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 = 前(15d)
每小时
_startTime = 前(21 小时)
当我使用 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-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 = 前(15d)
每小时
_startTime = 前(21 小时)