【问题标题】:Find peak times with historical data使用历史数据查找高峰时间
【发布时间】:2019-02-20 20:37:00
【问题描述】:

平均而言,我试图找出一天中哪些时间段的应用用户最活跃。数据包括时间戳和 ID。我将时间戳转换为日期 (M/d/yy) 列和小时 (HH:mm) 列,以便我可以按小时找到平均用户。

例如,如果 2019 年 2 月 17 日 15:00 有 6 个用户,2019 年 2 月 18 日 15:00 有 5 个用户,2019 年 2 月 19 日 15:00 有 4 个用户用户,15:00 的平均用户数为 5。我想通过 15 分钟的 bin 查询每个时间从 0:00 到 23:45 的表以及每次的平均用户数。这是我迄今为止尝试过的,但是当我手动计算时,查询没有显示正确的结果:

Table
| where timestamp > datetime(2018-5-23)
| extend hourNum= format_datetime(bin(timestamp, time(15m)),"HH:mm")
| extend Date= format_datetime(timestamp, "M/d/yy") 
| project timestamp, ID , Date, hourNum
| summarize avgUsers= (dcount(ID)*1.0)/dcount(Date) by hourNum

不胜感激,谢谢!

【问题讨论】:

    标签: azure-application-insights azure-data-explorer kql


    【解决方案1】:

    这可能是因为dcount 是实际不同计数as per this doc 的近似值:

    语法

    summarize dcount(Expr [, Accuracy])

    参数

    Expr:将用于聚合计算的表达式。

    准确度(如果指定)控制速度和准确度之间的平衡(见注)。

    • 0 = 最不准确和最快的计算。 1.6% 的错误
    • 1 = 默认值,平衡精度和计算时间;大约 0.8% 的误差。
    • 2 = 计算准确而缓慢;大约 0.4% 的误差。
    • 3 = 计算更加准确和缓慢;大约 0.28% 的误差。
    • 4 = 超精确和最慢的计算;大约 0.2% 的误差。

    您可以尝试使用 4 级准确度,这应该更接近手动计算。

    或者,您可以尝试利用双倍summarize(更慢但尽可能精确):

    | summarize by ID, hourNum
    | summarize count() by hourNum
    

    然后,您可以在hourNum 上加入ID count 和DateCount 并进行划分。

    总的来说,为了简单和足够好的精度,我建议使用更准确的 dcount。

    【讨论】:

    • 您好,德米特里,感谢您的回复。我尝试使用准确度语法,但出现错误。我也不明白您所说的替代选项是什么意思,所以如果您能详细说明,将不胜感激!
    • | summarize dcount(ID, 2) 应该适用于准确性案例(在本地尝试过)。
    • 使用两个汇总语句来实现准确的 dcount 的建议将完全像这样工作:(Table | where … | extend … | summarize by ID, hourNum | summarize DCOUNTID=count() by hourNum) join (Table | where … | extend … | summarize by Date, hourNum | summarize DCOUNTDate=count() by hourNum) on hourNum 这将提供一个包含 DCOUNTID 和 DCOUNTDate 的表,您可以在其中将一个表相除以获得必要的结果.
    猜你喜欢
    • 2015-10-18
    • 2014-11-28
    • 2022-01-18
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    相关资源
    最近更新 更多