首页 > 解决方案 > 使用历史数据查找高峰时间

问题描述

平均而言,我试图找出一天中哪些时间在应用程序上拥有最活跃的用户。数据包括时间戳和 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-insightsazure-data-explorerkql

解决方案


这可能是由于根据此文档dcount是实际不同计数的近似值:

句法

summarize dcount(Expr [, Accuracy])

论据

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

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

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

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

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

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

然后,您可以加入 ID 计数和 DateCounthourNum并进行划分。

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


推荐阅读