如何在KQL中无需指定日期筛选完整的上一周数据?
在KQL中筛选完整上一周数据(无需指定具体日期)
要筛选完整的上一周数据(不管当前是周几,都能拿到上一整周的所有记录),不用硬编码具体日期,最直接高效的方式是通过KQL的startofweek()函数计算出上一周的时间范围,而非先用ago()再二次筛选。
核心思路
- 定义一周的起始日(默认是周日,可改为周一);
- 计算上一周的起始时间和当前周的起始时间;
- 直接在
where子句中过滤出时间落在上一周范围内的数据。
代码示例(以周一为一周起始)
// 定义一周起始为周一(参数1代表周一,若要周日起始改为0即可) let last_week_start = startofweek(now(), 1) - 7d; let current_week_start = startofweek(now(), 1); AzureActivity // 筛选上一周的完整数据:上周一零点到本周一零点(不含本周一零点) | where TimeGenerated >= last_week_start and TimeGenerated < current_week_start // 按日期分组统计,同时输出对应的星期几 | summarize count() by bin(TimeGenerated, 1d), dow=dayofweek(bin(TimeGenerated, 1d)) // 按日期排序,结果更直观 | sort by bin_TimeGenerated asc
对原思路的补充
如果坚持用你最初的“先查前13天再二次筛选”的思路,也可以通过dayofweek()结合当前星期几来计算过滤条件,但这种方式代码可读性差、性能也不如直接过滤时间范围:
AzureActivity | where TimeGenerated > ago(13d) | summarize count() by bin(TimeGenerated, 1d), dow=dayofweek(bin(TimeGenerated, 1d)) // 计算当前星期几,筛选出上一周的所有日期 | let current_dow = dayofweek(now()); | where bin_TimeGenerated between (now() - (current_dow + 7)d .. now() - (current_dow + 1)d)
说明
- KQL中
dayofweek()返回值:0=周日,1=周一,...,6=周六; - 优先推荐第一种直接计算时间范围的方法,既能保证逻辑准确,又能减少不必要的数据处理。
内容的提问来源于stack exchange,提问作者HarriS
相关产品推荐
相关产品推荐

