使用按 Z 排序的前 N ​​个按 Y 汇总 X

Summarize X by Y using top N sorted by Z

Kusto 允许我根据按某些规则排序的 table 行的顶部创建在某些列上切片的汇总统计信息。例如,如果我想使用最后 100 行计算每个位置的平均分数,我可以写

T | top 100 by Time | summarize avg(Score) by Location

但我希望顶部应用到摘要的每个箱子。例如,我想计算每个位置可用的最后 10 个分数的平均值。我不知道我该怎么做。起初我以为我可能只能使用它的顶部嵌套 returns 前 n 个位置;我想 return 记录所有位置,并使用每个位置的前 n 个来计算聚合。我愿意通过对每个位置有效地重复查询的方法来做到这一点,但我需要最终结果在一个 table 中,其中包含位置和 AvgOfLast10Scores 列。

这是一个选项(在本例中它将采用最后两次测量):

datatable(Time:datetime, Location: string, Score:int)[datetime(2021-01-10), "a", 6, 
    datetime(2021-01-10 01:00), "a", 7,
    datetime(2021-01-10 02:00), "a", 8,
    datetime(2021-01-10 03:00), "a", 10,
    datetime(2021-01-10), "b", 10,
    datetime(2021-01-10 01:00), "b", 20,
    datetime(2021-01-10 02:00), "b", 30,
    datetime(2021-01-10 03:00), "b", 40]
| order by Location asc, Time desc 
| extend rowNumber = row_number(0, Location != prev(Location))
| where rowNumber <= 1
| summarize avg(Score) by Location

结果:

我建议使用 partition by 然后 summarize:

let T = datatable(Timestamp:datetime, Location:string, Score: int) 
[
    "01/01/2021", "Texas", 1,
    "01/02/2021", "Texas", 2,
    "01/03/2021", "Texas", 4,
    "01/03/2021", "Alabama", 1,
    "01/04/2021", "Alabama", 3,
    "01/05/2021", "Alabama", 4,
];
T
| partition by Location (top 2 by Timestamp)
| summarize avg(Score) by Location

结果:

您也许还可以使用 top-nested,但我发现顶部嵌套令人困惑。您可以在 MS documentation

中阅读有关分区的更多信息