mv-apply 運算子
將子查詢套用至每一筆記錄,並傳回所有子查詢結果的聯集。
例如,假設 T
資料表具有 dynamic
類型的 Metric
資料行,其值為 real
數字的陣列。 下列查詢會找出每個 Metric
值中的兩個最大值,並傳回對應至這些值的記錄。
T | mv-apply Metric to typeof(real) on
(
top 2 by Metric desc
)
mv-apply
運算子的處理步驟如下:
- 使用
mv-expand
運算子,將輸入中的每一筆記錄展開至子資料表 (順序會保留)。 - 針對每個子資料表套用子查詢。
- 將零或多個資料行新增至產生的子資料表。 這些資料行包含未展開的來源資料行值,並且會在需要時重複。
- 傳回結果的聯集。
mv-apply
運算子會取得下列輸入:
一或多個運算式,這些運算式會評估為要展開的動態陣列。 每個展開子資料表中的記錄數目,是每個動態陣列的最大長度。 當指定多個運算式,且對應的陣列具有不同長度,便會新增 Null 值。
(選擇性) 在展開之後指派運算式值的名稱。 這些名稱會成為子資料表中的資料行名稱。 如果未指定,則系統會在運算式為資料行參考時,使用資料行的原始名稱。 否則會使用隨機名稱。
注意
建議使用預設的資料行名稱。
在展開之後,這些動態陣列的元素資料類型。 這些會成為子資料表中,資料行的資料行類型。 如果未指定,就會使用
dynamic
。(選擇性) 要新增至子資料表的資料行名稱,該名稱會指派陣列中以 0 為基礎的元素索引,此索引會在子資料表記錄中產生。
(選擇性) 要展開的陣列元素數目上限。
mv-apply
運算子可視為 mv-expand
運算子的一般化 (若子查詢僅包含投影,則後者實際上可由前者執行)。
語法
T|
mv-apply
[ItemIndex] ColumnsToExpand [RowLimit] on
(
SubQuery)
其中 ItemIndex 的語法如下:
with_itemindex
=
IndexColumnName
ColumnsToExpand 是以逗號分隔的清單,其中有一或多個表單元素:
[Name=
] ArrayExpression [to
typeof
(
Typename)
]
RowLimit 僅為:
limit
RowLimit
和 SubQuery 具有任何查詢陳述式的相同語法。
深入瞭解 語法慣例。
參數
名稱 | 類型 | 必要 | Description |
---|---|---|---|
ItemIndex | string |
指出類型數據行的名稱,這個數據行 long 會附加至輸入做為陣列展開階段的一部分,並指出展開值的0型數位列索引。 |
|
名稱 | string |
要指派每個數位展開表達式之數位展開值的名稱。 如果未指定,則會使用數據行的名稱。 如果 ArrayExpression 不是簡單的資料行名稱,就會產生隨機名稱。 | |
ArrayExpression | dynamic |
✔️ | 陣列,其值為陣列展開。 如果表達式是輸入中的數據行名稱,則輸入數據行會從輸入中移除,並移除相同名稱的新數據行,或指定時出現的 ColumnName 。 |
Typename | string |
數位 ArrayExpression 所採用之個別元素的類型dynamic 名稱。 不符合此類型的元素會以 Null 值取代。 如果未指定, dynamic 預設會使用 。 |
|
RowLimit | int |
要從輸入的每個記錄產生的記錄數目限制。 如果未指定,則會使用2147483647。 | |
SubQuery | string |
具有隱含表格式來源的表格式查詢表達式,會套用至每個數位展開的子數據表。 |
注意
mv-expand
不同於運算子,mv-apply
運算符不支援bagexpand=array
擴充。 如果要展開的表達式是屬性包而非數位,您可以使用內部 mv-expand
運算子 (請參閱下列範例) 。
範例
從陣列中取得最大的元素
let _data =
range x from 1 to 8 step 1
| summarize l=make_list(x) by xMod2 = x % 2;
_data
| mv-apply element=l to typeof(long) on
(
top 1 by element
)
輸出
xMod2 |
l | element |
---|---|---|
1 | [1, 3, 5, 7] | 7 |
0 | [2, 4, 6, 8] | 8 |
計算陣列中最大的兩個元素總和
let _data =
range x from 1 to 8 step 1
| summarize l=make_list(x) by xMod2 = x % 2;
_data
| mv-apply l to typeof(long) on
(
top 2 by l
| summarize SumOfTop2=sum(l)
)
輸出
xMod2 |
l | SumOfTop2 |
---|---|---|
1 | [1,3,5,7] | 12 |
0 | [2,4,6,8] | 14 |
選取陣列中的元素
datatable (Val:int, Arr1:dynamic, Arr2:dynamic)
[ 1, dynamic(['A1', 'A2', 'A3']), dynamic([10, 30, 7]),
7, dynamic(['B1', 'B2', 'B5']), dynamic([15, 11, 50]),
3, dynamic(['C1', 'C2', 'C3', 'C4']), dynamic([6, 40, 20, 8])
]
| mv-apply NewArr1=Arr1, NewArr2=Arr2 to typeof(long) on (
top 2 by NewArr2
| summarize NewArr1=make_list(NewArr1), NewArr2=make_list(NewArr2)
)
輸出
Val1 | Arr1 | Arr2 | NewArr1 |
NewArr2 |
---|---|---|---|---|
1 | [“A1”,“A2”,“A3”] | [10,30,7] | [“A2',”A1“] | [30,10] |
7 | [“B1”,“B2”,“B5”] | [15,11,50] | [“B5”,“B1”] | [50,15] |
3 | [“C1”,“C2”,“C3”,“C4”] | [6,40,20,8] | [“C2”,“C3”] | [40,20] |
使用 with_itemindex
來處理陣列的子集
let _data =
range x from 1 to 10 step 1
| summarize l=make_list(x) by xMod2 = x % 2;
_data
| mv-apply with_itemindex=index element=l to typeof(long) on
(
// here you have 'index' column
where index >= 3
)
| project index, element
輸出
索引 | element |
---|---|
3 | 7 |
4 | 9 |
3 | 8 |
4 | 10 |
使用 Mutiple 資料行聯結 2 個陣列的專案
datatable (Val: int, Arr1: dynamic, Arr2: dynamic)
[
1, dynamic(['A1', 'A2', 'A3']), dynamic(['B1', 'B2', 'B3']),
5, dynamic(['C1', 'C2']), dynamic(['D1', 'D2'])
]
| mv-apply Arr1, Arr2 on (
extend Out = strcat(Arr1, "_", Arr2)
| summarize Arr1 = make_list(Arr1), Arr2 = make_list(Arr2), Out= make_list(Out)
)
輸出
Val | Arr1 | Arr2 | Out |
---|---|---|---|
1 | [“A1”,“A2”,“A3”] | [“B1”,“B2”,“B3”] | [“A1_B1”,“A2_B2”,“A3_B3”] |
5 | [“C1”,“C2”] | [“D1”,“D2”] | [“C1_D1”,“C2_D2”] |
將 mv-apply 套用至屬性包
在下列範例中,會搭配內部 mv-expand
,使用 mv-apply
,從屬性包中移除不是以 "555" 開頭的值:
datatable(SourceNumber: string, TargetNumber: string, CharsCount: long)
[
'555-555-1234', '555-555-1212', 46,
'555-555-1212', '', int(null)
]
| extend values = pack_all()
| mv-apply removeProperties = values on
(
mv-expand kind = array values
| where values[1] !startswith "555"
| summarize propsToRemove = make_set(values[0])
)
| extend values = bag_remove_keys(values, propsToRemove)
| project-away propsToRemove
輸出
SourceNumber | TargetNumber | CharsCount | 值 |
---|---|---|---|
555-555-1234 | 555-555-1212 | 46 | { "SourceNumber": "555-555-1234"、 "TargetNumber": "555-555-1212" } |
555-555-1212 | { "SourceNumber": "555-555-1212" } |
相關內容
- mv-expand 運算符
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應