operator mv-apply

Menerapkan kueri bertumpuk ke setiap catatan dan menampilkan gabungan hasil dari semua kueri bertumpuk.

Misalnya, anggaplah tabel T memiliki kolom Metric dari jenis dynamic yang nilainya adalah larik dengan angka real. Kueri berikut menemukan dua nilai terbesar di setiap Metric nilai, dan mengembalikan rekaman yang sesuai dengan nilai-nilai ini.

T | mv-apply Metric to typeof(real) on 
(
   top 2 by Metric desc
)

Operator mv-apply memiliki langkah-langkah pemrosesan berikut:

  1. Menggunakan operator mv-expand untuk memperluas setiap catatan dalam input ke subtabel (urutan dipertahankan).
  2. Menerapkan kueri bertumpuk untuk tiap-tiap subtabel.
  3. Menambahkan nol atau beberapa kolom ke subtabel yang dihasilkan. Kolom ini berisi nilai kolom sumber yang tidak diperluas, dan akan diulang jika diperlukan.
  4. Menampilkan gabungan hasil.

Operator mv-apply menerima input berikut:

  1. Satu atau beberapa ekspresi yang mengevaluasi ke larik dinamis yang akan diperluas. Jumlah catatan di setiap subtabel yang diperluas adalah panjang maksimum dari tiap-tiap larik dinamis tersebut. Nilai null ditambahkan ketika beberapa ekspresi ditentukan dan larik terkait memiliki panjang berbeda.

  2. Atau, nama untuk menetapkan nilai ekspresi setelah ekspansi. Nama-nama ini menjadi nama kolom di subtabel. Jika tidak ditentukan, nama asli kolom digunakan saat ekspresi adalah referensi kolom. Sebaliknya, nama acak digunakan.

    Catatan

    Sebaiknya gunakan nama kolom default.

  3. Jenis data elemen dari larik dinamis tersebut, setelah ekspansi. Jenis data ini menjadi jenis kolom dari kolom di subtabel. Jika tidak ditentukan, dynamic digunakan.

  4. Secara opsional, nama kolom yang akan ditambahkan ke subtabel yang menentukan indeks elemen berbasis 0 dalam larik yang menghasilkan catatan subtabel.

  5. Secara opsional, jumlah maksimum elemen larik yang akan diperluas.

Operator mv-apply dapat dianggap sebagai generalisasi operator mv-expand (pada kenyataannya, operator terbaru dapat diimplementasikan oleh operator sebelumnya, jika kueri bertumpuk hanya mencakup proyeksi.)

Sintaks

T|mv-apply [ItemIndex] ColumnsToExpand [RowLimit] on(SubQuery)

Ketika ItemIndex memiliki sintaksis:

with_itemindex=IndexColumnName

ColumnsToExpand adalah daftar dari satu atau beberapa elemen formulir yang dipisahkan koma:

[Name=] ArrayExpression [totypeof(Typename)]

RowLimit adalah:

limitRowLimit

dan SubQuery memiliki sintaksis dari setiap pernyataan kueri.

Pelajari selengkapnya tentang konvensi sintaksis.

Parameter

Nama Jenis Diperlukan Deskripsi
ItemIndex string Menunjukkan nama kolom jenis long yang ditambahkan ke input sebagai bagian dari fase ekspansi array dan menunjukkan indeks array berbasis 0 dari nilai yang diperluas.
Nama string Nama untuk menetapkan nilai yang diperluas array dari setiap ekspresi yang diperluas array. Jika tidak ditentukan, nama kolom akan digunakan jika tersedia. Nama acak dihasilkan jika ArrayExpression bukan nama kolom sederhana.
ArrayExpression dynamic ✔️ Array yang nilainya diperluas array. Jika ekspresi adalah nama kolom dalam input, kolom input dihapus dari input dan kolom baru dengan nama yang sama, atau ColumnName jika ditentukan, muncul dalam output.
Nama jenis string Nama jenis yang diambil elemen individual array dynamicArrayExpression . Elemen yang tidak sesuai dengan jenis ini digantikan oleh nilai null. Jika tidak ditentukan, dynamic digunakan secara default.
RowLimit int Batas jumlah rekaman yang akan dihasilkan dari setiap rekaman input. Jika tidak ditentukan, 2147483647 digunakan.
SubKueri string Ekspresi kueri tabular dengan sumber tabular implisit yang diterapkan ke setiap subtabel yang diperluas array.

Catatan

mv-expand Tidak seperti operator, mv-apply operator tidak mendukung bagexpand=array ekspansi. Jika ekspresi yang akan diperluas adalah tas properti dan bukan array, Anda dapat menggunakan operator dalam (lihat contoh di mv-expand bawah).

Contoh

Mendapatkan elemen terbesar dari larik

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
    )

Output

xMod2 l elemen
1 [1, 3, 5, 7] 7
0 [2, 4, 6, 8] 8

Menghitung jumlah dua elemen terbesar dalam larik

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)
    )

Output

xMod2 l SumOfTop2
1 [1,3,5,7] 12
0 [2,4,6,8] 14

Memilih elemen dalam array

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)
)

Output

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]

Menggunakan with_itemindex agar dapat berfungsi dengan sebagian larik

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

Output

indeks elemen
3 7
4 9
3 8
4 10

Menggunakan kolom mutiple untuk menggabungkan elemen 2 array

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)
    )

Output

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"]

Menerapkan mv-apply ke tas properti

Dalam contoh berikut, mv-apply digunakan dalam kombinasi dengan mv-expand dalam untuk menghapus nilai yang tidak dimulai dengan "555" dari tas properti:

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

Output

SourceNumber TargetNumber CharsCount values
555-555-1234 555-555-1212 46 {
"SourceNumber": "555-555-1234",
"TargetNumber": "555-555-1212"
}
555-555-1212     {
"SourceNumber": "555-555-1212"
}