教程:联接多个表中的数据

联接多个表中的数据可以通过组合不同源中的信息并在数据点之间创建新关系来执行更全面的分析。 在 Kusto 查询语言 (KQL) 中,joinlookup 运算符用于组合不同表中的数据。

本教程介绍以下操作:

本教程中的示例使用公开提供的帮助群集

先决条件

  • 用于登录到帮助群集的 Microsoft 帐户或 Microsoft Entra 用户标识

使用联接运算符

示例数据库中有两个与风暴事件相关的表。 一个表名为 StormEvents,另一个表名为 PopulationData。 在本部分,你将联接这两个表以执行数据分析,而单独使用一个表做不到这一点。

了解数据

使用 take 运算符查看每个表包含的数据。

StormEvents 
| take 5

下表仅显示了 22 个返回列中的 6 个。

StartTime EndTime EpisodeId EventId 状态 EventType ...
2007-09-20T21:57:00Z 2007-09-20T22:05:00Z 11078 60913 佛罗里达州 龙卷风 ...
2007-12-20T07:50:00Z 2007-12-20T07:53:00Z 12554 68796 密西西比州 雷雨大风 ...
2007-12-30T16:00:00Z 2007-12-30T16:05:00Z 11749 64588 佐治亚州 雷雨大风 ...
2007-09-29T08:11:00Z 2007-09-29T08:11:00Z 11091 61032 大西洋南部 Waterspout ...
2007-09-18T20:00:00Z 2007-09-19T18:00:00Z 11074 60904 佛罗里达州 暴雨 ...
PopulationData 
| take 5

输出

状态 人口数
ALABAMA 4918690
ALASKA 727951
ARIZONA 7399410
ARKANSAS 3025880
CALIFORNIA 39562900

这两个表都包含 State 列。 StormEvents 表包含其他许多列,而 PopulationData 表只包含另外一列,该列包含给定州的人口。

联接表

PopulationData 表与公有列 StormEvents 中的 State 相联接,以查找风暴在各州造成的人均总财产损失。

StormEvents
| summarize PropertyDamage = sum(DamageProperty) by State
| join kind=innerunique PopulationData on State
| project State, PropertyDamagePerCapita = PropertyDamage / Population
| sort by PropertyDamagePerCapita

| render columnchart 添加到查询以可视化结果。

Screenshot of column chart showing property damage per capita by state.

提示

可以使用 join 运算符执行多种类型的联接。 参阅联接风格列表

使用 lookup 运算符

lookup 运算符优化查询的性能,在这些查询中,已使用维度表中的数据扩充了事实数据表。 它使用在维度表中查找的值扩展事实数据表。 为获得最佳性能,系统默认情况下假定左表是较大的事实数据表,右表是较小的维度表。 这与 join 运算符使用的假设完全相反。

在帮助群集中,还有另一个名为 ContosoSales 的数据库,其中包含销售数据。 以下查询使用 lookup 合并此数据库中的 SalesFactProducts 表,以获取按产品类别列出的总销售额。

SalesFact
| lookup Products on ProductKey
| summarize TotalSales = count() by ProductCategoryName
| order by TotalSales desc

输出

ProductCategoryName TotalSales
游戏和玩具 966782
电视和视频 715024
相机和摄像机 323003
计算机 313487
家用电器 237508
音频 192671
手机 50342
音乐、电影和有声读物 33376

注意

lookup 运算符仅支持两种联接风格:leftouterinner

联接查询生成的表

还可以根据同一个表的查询结果进行联接。

假设你要创建同时发生了闪电和雪崩事件的州的列表。 使用 join 运算符基于 State 列合并两个表的行 – 一个表包含闪电事件的数据,另一个表包含雪崩事件的数据。

StormEvents
| where EventType == "Lightning"
| distinct State
| join kind=inner (
    StormEvents 
    | where EventType == "Avalanche"
    | distinct State
    )
    on State
| project State

输出

状态
OREGON
犹他州
怀俄明州
华盛顿州
科罗拉多州
爱达荷州
NEVADA