你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

top-nested 运算符

运算符 top-nested 执行分层聚合和值选择。

假设你有一个表,其中包含区域、销售人员、销售金额等销售信息。 操作员 top-nested 可以帮助你回答复杂的问题,例如“按销售额排名前五的区域是什么,以及每个区域中排名前三的销售人员是谁?”

源数据基于第一个 top-nested 子句中设置的条件(例如区域)进行分区。 接下来,运算符使用聚合(如添加销售额)选取每个分区中排名靠前的记录。 每个后续 top-nested 子句都会优化由上一个子句创建的分区,从而创建更精确的组的层次结构。

结果是一个表,每个子句有两列。 一列保存分区值(如区域),另一列保存聚合计算的结果,如销售额之和。

语法

T|top-nested [ N ] ofExpr [withothers=constExpr] byAggregation [asc | desc] [ [,
  top-nested ... ]

详细了解语法约定

参数

名称 类型 必需 说明
T string ✔️ 输入表格表达式。
N int 要为此层次结构级别返回的顶级值的数目。 如果省略,则返回所有非重复值。
Expr string ✔️ 针对输入记录的表达式,指示要为此层次结构级别返回的值。 通常,它引用 T 中的列,或涉及 列上的 bin () 等计算。 (可选)将输出列名称设置为 Name=Expr
ConstExpr string 如果指定,则对于每个层次结构级别,将添加一个记录,该值是未进入顶部的所有记录的聚合值。
聚合 string 应用于具有相同 Expr 值的记录的聚合函数。 结果确定排名靠前的记录。 请参阅 支持的聚合函数。 (可选)将输出列名称设置为 “名称=聚合”。

支持的聚合函数

支持以下聚合函数:

注意

还支持聚合的任何代数组合。

返回

每个子句包含两列的表。 一列包含使用 Expr 计算的唯一值,另一列显示从 聚合 计算中获得的结果。

包括来自其他列的数据

输出表中仅显示指定为 top-nestedExpr 子句的列。

若要包含特定级别的列的所有值,请:

  1. 不要指定 N 的值。
  2. 将列名用作 Expr 的值。
  3. 使用 Ignore=max(1) 作为 Aggregation 的值。
  4. 使用 project-away 删除不必要的Ignore列。

有关示例,请参阅 获取每个状态的最新事件以及来自其他列的其他数据

性能注意事项

记录数可能会随着子句数 top-nested 呈指数级增长,如果未指定 N 个限制,则记录增长速度更快。 此运算符可能会消耗大量资源。

如果聚合的分布非常不一致,请通过指定 N 来限制要返回的非重复值的数量。然后,使用 withothers=ConstExpr 规范获取所有其他事例的权重指示。

示例

运算符入门top-nested

以下查询按列对表进行分区 StormEventsState 并计算每个州的总纬度。 查询选择纬度总和最高的前两个州。 在这前两个状态中,查询将数据分组为 依据 Source ,并选择纬度总和最高的前三个源。 对于处于前两个状态的前三个源,查询将按数据分组 EndLocation ,并选择 EndLocation 纬度总和最高的 。

StormEvents                                        // Data source.
| top-nested 2 of State       by sum(BeginLat),    // Top 2 States by total latitude.
  top-nested 3 of Source      by sum(BeginLat),    // Top 3 Sources by total latitude in each State.
  top-nested 1 of EndLocation by sum(BeginLat)     // Top 1 EndLocation by total latitude in each Source and State.

输出

状态 aggregated_State Source aggregated_Source EndLocation aggregated_EndLocation
KANSAS 87771.2355000001 执法机构 18744.823 FT SCOTT 264.858
KANSAS 87771.2355000001 公用 22855.6206 BUCKLIN 488.2457
KANSAS 87771.2355000001 专业观测员 21279.7083 SHARON SPGS 388.7404
德克萨斯 123400.5101 公用 13650.9079 AMARILLO 246.2598
德克萨斯 123400.5101 执法机构 37228.5966 PERRYTON 289.3178
德克萨斯 123400.5101 专业观测员 13997.7124 CLAUDE 421.44

使用来自另一列的数据增强顶嵌套结果

以下查询基于上一个示例,引入了一个 extra top-nested 子句。 在此新子句中,缺少数值规范会导致提取跨分区的所有非重复值 EventTypemax(1)聚合函数只是一个占位符,呈现其结果不相关,因此 project-away 运算符会删除列Ignore。 结果显示与先前聚合的数据关联的所有事件类型。

StormEvents
| top-nested 2 of State       by sum(BeginLat),
  top-nested 3 of Source      by sum(BeginLat),
  top-nested 1 of EndLocation by sum(BeginLat),
  top-nested   of EventType   by Ignore = max(1)
| project-away Ignore

输出

状态 aggregated_State Source aggregated_Source EndLocation aggregated_EndLocation EventType
德克萨斯 123400.51009999994 公用 13650.907900000002 AMARILLO 246.25979999999998 冰雹
德克萨斯 123400.51009999994 公用 13650.907900000002 AMARILLO 246.25979999999998 雷雨大风
KANSAS 87771.235500000068 公用 22855.6206 BUCKLIN 488.2457 洪水
KANSAS 87771.235500000068 公用 22855.6206 BUCKLIN 488.2457 雷雨大风
KANSAS 87771.235500000068 公用 22855.6206 BUCKLIN 488.2457 冰雹
德克萨斯 123400.51009999994 专业观测员 13997.712400000009 CLAUDE 421.44 冰雹
KANSAS 87771.235500000068 执法机构 18744.823000000004 FT SCOTT 264.858 山洪
KANSAS 87771.235500000068 执法机构 18744.823000000004 FT SCOTT 264.858 雷雨大风
KANSAS 87771.235500000068 执法机构 18744.823000000004 FT SCOTT 264.858 洪水
德克萨斯 123400.51009999994 执法机构 37228.596599999961 PERRYTON 289.3178 冰雹
... ... ... ... ... ...

使用 withothers 浏览排除的数据

在子句中 top-nested 合并时, withothers 规范会引入一条额外的记录,用于聚合从排名靠前的结果中排除的数据。 在以下查询中,在 Stateaggregated_State 列中创建一条额外的记录,表示除堪萨斯州和得克萨斯州外的所有州的集体纬度。 此外, EndLocationaggregated_EndLocation 列还有 9 条额外的记录。 这些记录显示结束位置的组合纬度不符合每个状态和源中顶级位置的条件。

StormEvents
| top-nested 2 of State with others = "All Other States" by sum(BeginLat),
  top-nested 3 of Source by sum(BeginLat),
  top-nested 1 of EndLocation with others = "All Other End Locations" by sum(BeginLat)

输出

状态 aggregated_State Source aggregated_Source EndLocation aggregated_EndLocation
KANSAS 87771.2355000001 执法机构 18744.823 FT SCOTT 264.858
KANSAS 87771.2355000001 公用 22855.6206 BUCKLIN 488.2457
KANSAS 87771.2355000001 专业观测员 21279.7083 SHARON SPGS 388.7404
德克萨斯 123400.5101 公用 13650.9079 AMARILLO 246.2598
德克萨斯 123400.5101 执法机构 37228.5966 PERRYTON 289.3178
德克萨斯 123400.5101 专业观测员 13997.7124 CLAUDE 421.44
KANSAS 87771.2355000001 执法机构 18744.823 所有其他结束位置 18479.965
KANSAS 87771.2355000001 公用 22855.6206 所有其他结束位置 22367.3749
KANSAS 87771.2355000001 专业观测员 21279.7083 所有其他结束位置 20890.9679
德克萨斯 123400.5101 公用 13650.9079 所有其他结束位置 13404.6481
德克萨斯 123400.5101 执法机构 37228.5966 所有其他结束位置 36939.2788
德克萨斯 123400.5101 专业观测员 13997.7124 所有其他结束位置 13576.2724
KANSAS 87771.2355000001 所有其他结束位置 24891.0836
德克萨斯 123400.5101 所有其他结束位置 58523.2932000001
所有其他州 1149279.5923 所有其他结束位置 1149279.5923

以下查询显示上一个示例中使用的第一个级别的相同结果。

StormEvents
| where State !in ('TEXAS', 'KANSAS')
| summarize sum(BeginLat)

输出

sum_BeginLat
1149279.5923

对分层结果进行排序

为了实现全面的排序顺序,以下查询对当前层次结构级别中的每个值(每个组)使用基于索引的排序。 此排序旨在根据最终嵌套级别(在本例 EndLocation中为 )排列结果。

StormEvents
| top-nested 2 of State by sum(BeginLat),
  top-nested 2 of Source by sum(BeginLat),
  top-nested 4 of EndLocation by sum(BeginLat)
| sort by State, Source, aggregated_EndLocation
| summarize
    EndLocations = make_list(EndLocation, 10000),
    endLocationSums = make_list(aggregated_EndLocation, 10000)
    by State, Source
| extend indicies = range(0, array_length(EndLocations) - 1, 1)
| mv-expand EndLocations, endLocationSums, indicies

输出

状态 Source EndLocations endLocationSums 索引
德克萨斯 专业观测员 CLAUDE 421.44 0
德克萨斯 专业观测员 AMARILLO 316.8892 1
德克萨斯 专业观测员 DALHART 252.6186 2
德克萨斯 专业观测员 PERRYTON 216.7826 3
德克萨斯 执法机构 PERRYTON 289.3178 0
德克萨斯 执法机构 LEAKEY 267.9825 1
德克萨斯 执法机构 BRACKETTVILLE 264.3483 2
德克萨斯 执法机构 GILMER 261.9068 3
KANSAS 专业观测员 SHARON SPGS 388.7404 0
KANSAS 专业观测员 ATWOOD 358.6136 1
KANSAS 专业观测员 LENORA 317.0718 2
KANSAS 专业观测员 SCOTT CITY 307.84 3
KANSAS 公用 BUCKLIN 488.2457 0
KANSAS 公用 ASHLAND 446.4218 1
KANSAS 公用 PROTECTION 446.11 2
KANSAS 公用 MEADE STATE PARK 371.1 3

获取每个状态的最新事件以及来自其他列的其他数据

以下查询演示如何检索每个美国州的最新两个事件以及相关事件详细信息。 请注意,在某些列(由 Ignore*标识)中使用 max(1) ,这有助于在不施加任何选择逻辑的情况下通过查询传播数据。

StormEvents
| top-nested of State by Ignore0=max(1),                  // Partition the data by each unique value of state.
  top-nested 2 of StartTime by Ignore1=max(StartTime),    // Get the 2 most recent events in each state.
  top-nested of EndTime by Ignore2=max(1),                // Append the EndTime for each event.
  top-nested of EpisodeId by Ignore3=max(1)               // Append the EpisodeId for each event.
| project-away Ignore*                                    // Remove the unnecessary aggregation columns.
| order by State asc, StartTime desc                      // Sort results alphabetically and chronologically.

获取每个标识的最新记录以及来自其他列的其他数据

以下查询展示了如何提取每个标识的最新记录,并基于上一示例中介绍的概念构建。 第一个 top-nested 子句按 的非重复值 id对数据进行分区。 后续子句根据 timestamp 每个 id的 标识两个最新记录。 其他信息是使用 top-nested 运算符以及未指定的计数和任意 max(1) 聚合追加的。 最后,使用 project-away 运算符删除不必要的聚合列。

datatable(id: string, timestamp: datetime, otherInformation: string) // Create a source datatable.
[
    "Barak", datetime(2015-01-01), "1",
    "Barak", datetime(2016-01-01), "2",
    "Barak", datetime(2017-01-20), "3",
    "Donald", datetime(2017-01-20), "4",
    "Donald", datetime(2017-01-18), "5",
    "Donald", datetime(2017-01-19), "6"
]
| top-nested of id by Ignore0=max(1),                     // Partition the data by each unique value of id.
  top-nested 2 of timestamp by Ignore1=max(timestamp),    // Get the 2 most recent events for each state.
  top-nested of otherInformation by Ignore2=max(1)        // Append otherInformation for each event.
| project-away Ignore0, Ignore1, Ignore2                  // Remove the unnecessary aggregation columns.

输出

id timestamp otherInformation
Barak 2016-01-01T00:00:00Z 2
Donald 2017-01-19T00:00:00Z 6
Barak 2017-01-20T00:00:00Z 3
Donald 2017-01-20T00:00:00Z 4