[ バージョン ] ドロップダウン リストを使用してサービスを切り替えます。 ナビゲーションの詳細を確認します。
適用対象: ✅ Microsoft Fabric ✅ Azure Data Explorer ✅ Azure Monitor ✅ Microsoft Sentinel
サブクエリを各レコードに適用し、全サブクエリの結果の和集合を返します。
たとえば、テーブル T に Metric 型の列 dynamic があり、その値が real 数値の配列であるとします。 次のクエリでは、各 Metric 値の中で最も大きい 2 つの値を検索し、これらの値に対応するレコードを返します。
T | mv-apply Metric to typeof(real) on
(
top 2 by Metric desc
)
mv-apply 演算子には、以下の処理手順があります。
-
mv-expand演算子を使用して、入力の各レコードをサブテーブルに展開します (順序は保持されます)。 - 各サブテーブルのサブクエリを適用します。
- 結果のサブテーブルに 0 個以上の列を追加します。 これらの列は、展開されていないソース列の値を含んでおり、必要に応じて繰り返されます。
- 結果の和集合を返します。
mv-apply 演算子は次の入力を取得します。
展開する動的配列として評価される 1 つ以上の式。 展開された各サブテーブルのレコード数は、これらの各動的配列の最大長です。 複数の式が指定され、対応する配列の長さが異なる場合は、null 値が追加されます。
必要に応じて、展開後に式の値を割り当てる名前。 これらの名前は、サブテーブル内の列名になります。 指定しない場合、式が列参照であるときに、元の列の名前が使用されます。 それ以外の場合は、ランダムな名前が使用されます。
注
既定の列名を使用することをお勧めします。
展開後の、動的配列の要素のデータ型。 これらのデータ型は、サブテーブル内の列の列型になります。 指定しない場合は、
dynamicが使用されます。必要に応じて、サブテーブル レコードを生成した配列内の要素の 0 から始まるインデックスを指定する、サブテーブルに追加する列の名前。
必要に応じて、展開する配列要素の最大数。
mv-apply 演算子は、mv-expand 演算子の一般化と考えることができます (実際、サブクエリにプロジェクションしか含まれていない場合は、前者によって後者を実装できます)
構文
T|mv-apply [ItemIndex] ColumnsToExpand [RowLimit] on(SubQuery)
Itemindex に次の構文がある場合:
with_itemindex
=
IndexColumnName
ColumnsToExpand は、次の形式の 1 つ以上の要素をコンマで区切ったリストです。
[名前=] ArrayExpression [totypeof(Typename)]
RowLimit は単純に次のようになります。
limit
Rowlimit
SubQuery には、クエリ ステートメントと同じ構文があります。
構文規則について詳しく知る。
パラメーター
| 件名 | タイプ | 必須 | 説明 |
|---|---|---|---|
ItemIndex |
string |
配列拡張フェーズの一部として入力に追加される long 型の列の名前を示し、展開された値の 0 から始まる配列インデックスを示します。 |
|
Name |
string |
配列展開された各式の配列展開値を割り当てる名前。 指定しない場合は、列の名前が使用可能な場合に使用されます。 ArrayExpressionが単純な列名でない場合は、ランダムな名前が生成されます。 | |
ArrayExpression |
dynamic |
✔️ | 値が配列展開される配列。 式が入力内の列の名前である場合、入力列は入力から削除され、同じ名前の新しい列が削除されます。指定されている場合は ColumnName が出力に表示されます。 |
Typename |
string |
dynamic配列の個々の要素が受け取る型の名前ArrayExpression。 この型に準拠していない要素は、null 値に置き換えられます。 指定しない場合、 dynamic は既定で使用されます。 |
|
RowLimit |
int |
入力の各レコードから生成するレコード数の制限。 指定しない場合は、2147483647が使用されます。 | |
SubQuery |
string |
配列展開された各サブテーブルに適用される暗黙的な表形式ソースを含む表形式クエリ式。 |
注
mv-expand演算子とは異なり、mv-apply演算子はbagexpand=array展開をサポートしていません。 展開する式がプロパティ バッグであり、配列ではない場合は、内部 mv-expand 演算子を使用できます (次の例を参照)。
例
例を確認し、データ エクスプローラーのクエリ ページで実行します。
mv-apply によって行われる内部 mv-expand
このクエリは、mv-apply によって内部的に実行される mv-expand を理解するのに役立ちます
let data = datatable (index: int, Arr: dynamic)
[
0, dynamic([7]),
1, dynamic([6, 11, 7])
];
data
| mv-apply Arr2=Arr to typeof(long) on
(
take 100
)
出力
| インデックス | Arr | Arr2 |
|---|---|---|
| 0 | [7] | 7 |
| 1 | [6, 11, 7] | 6 |
| 1 | [6, 11, 7] | 11 |
| 1 | [6, 11, 7] | 7 |
配列から最大の要素を取得する
このクエリでは、配列の最大の要素を持つ新しい列が作成されます。
let data = datatable (index: int, Arr: dynamic)
[
0, dynamic([1, 5, 3]),
1, dynamic([10, 2, 5, 7])
];
data
| mv-apply topElem=Arr to typeof(long) on
(
top 1 by topElem
)
出力
| インデックス | Arr | topElem |
|---|---|---|
| 0 | [1, 5, 3] | 5 |
| 1 | [10, 2, 5, 7] | 10 |
配列内の上位 2 つの要素を検索する
クエリは、配列の上位 2 つの要素を新しい配列列 Top2 に保存します。
let data = datatable (index: int, Arr: dynamic)
[
0, dynamic([5, 1, 3]),
1, dynamic([4, 10, 8, 7])
];
data
| mv-apply Arr2=Arr to typeof(long) on
(
top 2 by Arr2
| summarize Top2=make_list(Arr2)
)
出力
| インデックス | Arr | Top2 |
|---|---|---|
| 0 | [5, 1, 3] | [5, 3] |
| 1 | [4, 10, 8, 7] | [10, 8] |
配列内の要素を選択する
このクエリでは、Arr2 値に基づいて各動的配列の上位 2 つの要素を識別し、それらを新しいリストにまとめます。
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 を使用する
クエリの結果、元のリストのインデックスと要素の値を含め、インデックスが 2 以上の行を含むテーブルが作成されます。
let data = datatable (row: int, Arr: dynamic)
[
0, dynamic([5, 1, 3]),
1, dynamic([4, 10, 8, 7])
];
data
| mv-apply with_itemindex=index value=Arr to typeof(long) on
(
// here you have 'index' column
where index >= 2
)
出力
| 行 | Arr | value |
index |
|---|---|---|---|
| 0 | [5, 1, 3] | 3 | 2 |
| 1 | [4, 10, 8, 7] | 8 | 2 |
| 1 | [4, 10, 8, 7] | 7 | 3 |
複数の列を使用して 2 つの配列の要素を結合する
このクエリでは、2 つの動的配列の要素を新しい連結形式に結合し、それらをリストにまとめます。
datatable (Val: int, Arr1: dynamic, Arr2: dynamic)
[
1, dynamic(['A1', 'A2']), dynamic(['B1', 'B2', 'B3']),
5, dynamic(['C1', 'C2']), dynamic(['D1'])
]
| mv-apply T1=Arr1, T2=Arr2 on (
extend Out = strcat(T1, "_", T2)
| summarize Out= make_list(Out)
)
出力
| ヴァル | Arr1 | Arr2 | Out |
|---|---|---|---|
| 1 | ["A1","A2"] | ["B1","B2","B3"] | ["A1_B1","A2_B2","_B3"] |
| 5 | ["C1","C2"] | ["D1"] | ["C1_D1","C2_"] |
プロパティ バッグに mv-apply を適用する
このクエリは、値が 555 で始まらない条件に基づいて、パックされた値オブジェクトからプロパティを動的に削除します。 最終的な結果には、不要なプロパティが削除された元の列が含まれます。
datatable(Source: string, Target: string, Count: long)
[
'555-1234', '555-1212', 46,
'555-2424', '', int(null)
]
| extend Pack = pack_all()
| mv-apply removeProperties = Pack on
(
mv-expand kind = array Pack
| where Pack[1] !startswith "555"
| summarize propsToRemove = make_set(Pack[0])
)
| extend values = bag_remove_keys(Pack, propsToRemove)
| project-away propsToRemove
出力
| 情報源 | 目標 | 数える | パック | values |
|---|---|---|---|---|
| 555-1234 | 555-1212 | 46 | { "Source": "555-1234", "Target": "555-1212", "Count": 46 } |
{ "Source": "555-1234", "Target": "555-1212" } |
| 555-2424 | { "Source": "555-2424", "Target": "", "Count": null } |
{ "Source": "555-2424" } |