Share via


innerunique 聯結

innerunique 結類別會從左側移除重複的索引鍵。 此行為可確保輸出包含每個唯一左鍵和右鍵組合的數據列。

根據預設,如果未kind指定 參數,innerunique則會使用聯結類別。 此預設實作在記錄/追蹤分析案例中很有用,您可以在其中以共用相互關聯標識符為基礎的兩個事件相互關聯。 它可讓您擷取所有現象實例,同時忽略造成相互關聯的重複追蹤記錄。

顯示聯結運作方式的圖表。

Syntax

LeftTable|joinkind=innerunique [ 提示 ] RightTableon條件

深入瞭解 語法慣例

參數

名稱 類型 必要 Description
LeftTable string ✔️ 左數據表或表格式表示式,有時稱為外部數據表,其數據列要合併。 表示方法為 $left
提示 string 名稱= 的形式以零或多個空格分隔聯結提示,控制數據列比對作業和執行計劃的行為。 如需詳細資訊,請參閱 提示
RightTable string ✔️ 右數據表或表格式表示式,有時稱為內部數據表,其數據列要合併。 表示方法為 $right
條件 string ✔️ 決定 LeftTable 中的數據列如何與 RightTable 中的數據列相符。 如果您想要比對的數據行在這兩個數據表中具有相同的名稱,請使用 ColumnName 語法ON。 否則,請使用 LeftColumn==$right.RightColumn 語法ON $left.。 若要指定多個條件,您可以使用 「and」 關鍵詞,或使用逗號分隔它們。 如果您使用逗號,則會使用 「and」 邏輯運算符來評估條件。

提示

為了獲得最佳效能,如果一個數據表一律小於另一個數據表,請使用它做為聯結的左邊。

提示

參數名稱 說明
hint.remote auto, left, local, right 請參閱跨叢集聯結
hint.strategy=broadcast 指定在叢集節點上共用查詢負載的方式。 請參閱廣播聯結
hint.shufflekey=<key> shufflekey 查詢會使用索引鍵來分割資料,以共用叢集節點上的查詢負載。 請參閱隨機查詢
hint.strategy=shuffle 策略 shuffle 查詢會在叢集節點上共用查詢負載,其中每個節點都會處理數據的一個分割區。 請參閱隨機查詢

傳回

架構:這兩個數據表中的所有數據行,包括相符的索引鍵。
數據列:左側數據表中所有重複數據刪除的數據列符合右數據表的數據列。

範例

使用預設 innerunique 聯結

let X = datatable(Key:string, Value1:long)
[
    'a',1,
    'b',2,
    'b',3,
    'c',4
];
let Y = datatable(Key:string, Value2:long)
[
    'b',10,
    'c',20,
    'c',30,
    'd',40
];
X | join Y on Key

輸出

答案 Value1 Key1 Value2
b 2 b 10
c 4 c 20
c 4 c 30

注意

索引鍵 'a' 和 'd' 不會出現在輸出中,因為在左側和右側沒有相符的索引鍵。

查詢會執行預設聯結,這是在根據聯結索引鍵重複數據刪除左側之後的內部聯結。 重複資料刪除只會保留第一筆記錄。 重複資料移除之後所產生聯結的左邊為:

答案 Value1
a 1
b 2
c 4

來自 innerunique 聯結的兩個可能輸出

注意

innerunique 結類別可能會產生兩個可能的輸出,而且兩者都正確。 在第一個輸出中,join 運算子會隨機選取出現在 t1 中的第一個索引鍵,其值為 "val1.1",並將其與 t2 索引鍵進行比對。 在第二個輸出中,join 運算子會隨機選取出現在 t1 中的第二個索引鍵,其值為 "val1.2",並將其與 t2 索引鍵進行比對。

let t1 = datatable(key: long, value: string)  
    [
    1, "val1.1",  
    1, "val1.2"  
];
let t2 = datatable(key: long, value: string)  
    [  
    1, "val1.3",
    1, "val1.4"  
];
t1
| join kind = innerunique
    t2
    on key

輸出

索引鍵 value key1 value1
1 val1.1 1 val1.3
1 val1.1 1 val1.4
let t1 = datatable(key: long, value: string)  
    [
    1, "val1.1",  
    1, "val1.2"  
];
let t2 = datatable(key: long, value: string)  
    [  
    1, "val1.3", 
    1, "val1.4"  
];
t1
| join kind = innerunique
    t2
    on key

輸出

索引鍵 value key1 value1
1 val1.2 1 val1.3
1 val1.2 1 val1.4
  • Kusto 會進行最佳化,如果可以的話,就會將 join 之後才來的篩選推送至適當的聯結側 (左側或右側)。
  • 有時候,所使用的類別是 innerunique,因此篩選會傳播至聯結的左邊。 類別會自動傳播,且套用至該篩選的索引鍵會出現在輸出中。
  • 使用上述範例,並新增篩選 where value == "val1.2" 。 它會提供第二個結果,而且永遠不會為數據集提供第一個結果:
let t1 = datatable(key: long, value: string)  
    [
    1, "val1.1",  
    1, "val1.2"  
];
let t2 = datatable(key: long, value: string)  
    [  
    1, "val1.3", 
    1, "val1.4"  
];
t1
| join kind = innerunique
    t2
    on key
| where value == "val1.2"

輸出

索引鍵 value key1 value1
1 val1.2 1 val1.3
1 val1.2 1 val1.4

取得擴充的登入活動

login 中取得擴充的活動,其中的某些項目會標示為活動的開始和結束。

let Events = MyLogTable | where type=="Event" ;
Events
| where Name == "Start"
| project Name, City, ActivityId, StartTime=timestamp
| join (Events
    | where Name == "Stop"
        | project StopTime=timestamp, ActivityId)
    on ActivityId
| project City, ActivityId, StartTime, StopTime, Duration = StopTime - StartTime
let Events = MyLogTable | where type=="Event" ;
Events
| where Name == "Start"
| project Name, City, ActivityIdLeft = ActivityId, StartTime=timestamp
| join (Events
        | where Name == "Stop"
        | project StopTime=timestamp, ActivityIdRight = ActivityId)
    on $left.ActivityIdLeft == $right.ActivityIdRight
| project City, ActivityId, StartTime, StopTime, Duration = StopTime - StartTime