top-nested 运算符

适用于:✅Azure 数据资源管理器Azure MonitorMicrosoft Sentinel

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

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

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

最终每个子句都可得到一个包含两列的表。 一列保存分区值(如区域),另一列保存聚合计算的结果,如总销售额。

语法

T | top-nested [ N ] of Expr [with others = ConstExpr] by Aggregation [asc | desc] [,
  top-nested ... ]

详细了解语法约定

参数

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

支持的聚合函数

支持以下聚合函数:

注意

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

返回

每个子句都可得到一个包含两列的表。 一列包含使用 Expr 计算的唯一值,另一列显示通过 Aggregation 计算获得的结果。

使用with others 条款

使用top-nested运算符跟with others增加了在更广泛的数据集设置看顶级内容的能力。 在以可视化方式渲染数据时,以这种方式评估数据非常有价值。

添加来自其他列的数据

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

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

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

想看例如,请参阅每个州的最新事件以及其他列数据

性能注意事项

记录的数量可以随着 top-nested条款的数量呈指数增长,如果没有指定N 参数,记录增长会更快。 这个运算符会消耗相当多的资源。

如果聚合分布不规则,请通过指定N来限制要返回的不同值的数量。然后使用with others = ConstExpr条款了解所有其他案件的权重。

示例

受灾最严重的州、事件类型和属性损失的结束地区

以下查询按State列对StormEvents表并计算各州的总财产损失。 该查询选择属性损失最热门的两个州。 在这两个热门州内,查询按EventType对数据进行分组,并选择造成损失最热门的三种事件类型。 然后查询按EndLocation对数据进行分组并选择损坏程度最高的EndLocation。 结果中仅显示一个 EndLocation 值,可能是由于风暴事件的较大性质或未记录结束位置导致。

StormEvents  // Data source.
| top-nested 2 of State by sum(DamageProperty),       // Top 2 States by total damaged property.
  top-nested 3 of EventType by sum(DamageProperty),   // Top 3 EventType by total damaged property for each State.
  top-nested 1 of EndLocation by sum(DamageProperty)  // Top 1 EndLocation by total damaged property for each EventType and State.
| project State, EventType, EndLocation, StateTotalDamage = aggregated_State, EventTypeTotalDamage = aggregated_EventType, EndLocationDamage = aggregated_EndLocation

输出

状态 EventType EndLocation StateTotalDamage EventTypeTotalDamage EndLocationDamage
CALIFORNIA 野火 1445937600 1326315000 1326315000
CALIFORNIA HighWind 1445937600 61320000 61320000
CALIFORNIA DebrisFlow 1445937600 48000000 48000000
OKLAHOMA IceStorm 915470300 826000000 826000000
OKLAHOMA WinterStorm 915470300 40027000 40027000
OKLAHOMA 洪水 商务 915470300 21485000 20000000

属性损失最多的五个州with others分组

以下示例使用top-nested操作员确定属性损失热门的五个州,并使用with others条款将所有其他州的受损属性归为一组。 然后,它使用 render 命令将前五个州和所有其他周的损失财产可视化为 piechart

StormEvents
| top-nested 5 of State with others="OtherStates" by sum(DamageProperty)
| render piechart  

输出

属性损失最严重的五个州的屏幕截图,其他所有州单独分组,以饼图形式呈现。

每个州的最新事件以及其他列数据

以下查询检索美国各州最近的两个事件以及相关事件详细信息。 它使用 max(1) 在某些列内传播数据而不使用顶部嵌套的选择逻辑。 已使用 project-away 移除生成的 Ignore 聚合列。

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例如提取每个标识的最新记录,并基于上一个示例中介绍的概念 第一top-nested条款按不同的id值对数据进行分区使用Ignore0=max(1)作为占位符。 每个id,它根据timestamp识别最近的两条记录。 使用top-nested运算符附加其他信息,不指定计数,并使用Ignore2=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