Operatore mv-apply
Si applica a: ✅Microsoft Fabric✅
Applica una sottoquery a ogni record e restituisce l'unione dei risultati di tutte le sottoquery.
Si supponga, ad esempio, che una tabella T
abbia una colonna Metric
di tipo dynamic
i cui valori sono matrici di real
numeri. La query seguente individua i due valori più grandi in ogni Metric
valore e restituisce i record corrispondenti a questi valori.
T | mv-apply Metric to typeof(real) on
(
top 2 by Metric desc
)
L'operatore mv-apply
prevede i passaggi di elaborazione seguenti:
- Usa l'operatore
mv-expand
per espandere ogni record nell'input in tabelle secondarie (l'ordine viene mantenuto). - Applica la sottoquery per ognuna delle sottotabella.
- Aggiunge zero o più colonne alla tabella secondaria risultante. Queste colonne contengono i valori delle colonne di origine che non sono espanse e vengono ripetute se necessario.
- Restituisce l'unione dei risultati.
L'operatore mv-apply
ottiene gli input seguenti:
Una o più espressioni che restituiscono matrici dinamiche da espandere. Il numero di record in ogni tabella secondaria espansa è la lunghezza massima di ognuna di queste matrici dinamiche. Vengono aggiunti valori Null in cui vengono specificate più espressioni e le matrici corrispondenti hanno lunghezze diverse.
Facoltativamente, i nomi da assegnare ai valori delle espressioni dopo l'espansione. Questi nomi diventano i nomi delle colonne nelle tabelle secondarie. Se non specificato, il nome originale della colonna viene usato quando l'espressione è un riferimento a una colonna. In caso contrario, viene usato un nome casuale.
Nota
È consigliabile usare i nomi di colonna predefiniti.
Tipi di dati degli elementi di tali matrici dinamiche, dopo l'espansione. Questi diventano i tipi di colonna delle colonne nelle tabelle secondarie. Se omesso, viene utilizzato
dynamic
.Facoltativamente, il nome di una colonna da aggiungere alle sottotable che specifica l'indice in base 0 dell'elemento nella matrice che ha generato il record sottotabella.
Facoltativamente, il numero massimo di elementi della matrice da espandere.
L'operatore mv-apply
può essere considerato come una generalizzazione dell'operatore mv-expand
(in realtà, quest'ultimo può essere implementato dal primo, se la sottoquery include solo proiezioni).
Sintassi
T|
mv-apply
[ItemIndex] ColumnsToExpand [RowLimit] on
(
SubQuery)
Dove ItemIndex ha la sintassi:
with_itemindex
=
IndexColumnName
ColumnsToExpand è un elenco delimitato da virgole di uno o più elementi del form:
[Name=
] ArrayExpression [to
typeof
(
Typename])
RowLimit è semplicemente:
limit
RowLimit
e SubQuery hanno la stessa sintassi di qualsiasi istruzione di query.
Altre informazioni sulle convenzioni di sintassi.
Parametri
Nome | Digita | Obbligatorio | Descrizione |
---|---|---|---|
ItemIndex | string |
Indica il nome di una colonna di tipo long aggiunta all'input come parte della fase di espansione della matrice e indica l'indice di matrice in base 0 del valore espanso. |
|
Nome | string |
Nome per assegnare i valori espansi dalla matrice di ogni espressione espansa dalla matrice. Se non specificato, il nome della colonna viene utilizzato, se disponibile. Se ArrayExpression non è un nome di colonna semplice, viene generato un nome casuale. | |
ArrayExpression | dynamic |
✔️ | Matrice i cui valori sono espansi dalla matrice. Se l'espressione è il nome di una colonna nell'input, la colonna di input viene rimossa dall'input e una nuova colonna con lo stesso nome o ColumnName , se specificata, viene visualizzata nell'output. |
Nometipo | string |
Nome del tipo che accettano i singoli elementi della dynamic matrice ArrayExpression . Gli elementi che non sono conformi a questo tipo vengono sostituiti da un valore Null. Se non specificato, dynamic viene utilizzato per impostazione predefinita. |
|
RowLimit | int |
Limite al numero di record da generare da ogni record dell'input. Se non specificato, viene usato 2147483647. | |
SottoQuery | string |
Espressione di query tabulare con un'origine tabulare implicita applicata a ogni sottotabella espansa con matrice. |
Nota
A differenza dell'operatore, l'operatore mv-expand
non supporta mv-apply
l'espansionebagexpand=array
. Se l'espressione da espandere è un contenitore delle proprietà e non una matrice, è possibile usare un operatore interno mv-expand
(vedere l'esempio seguente).
Esempi
Esaminare gli esempi ed eseguirli nella pagina query di Esplora dati.
Recupero dell'elemento più grande dalla matrice
La query restituisce il numero pari più piccolo (2) e il numero dispari più piccolo (1).
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 | element |
---|---|---|
1 | [1, 3, 5, 7] | 7 |
0 | [2, 4, 6, 8] | 8 |
Calcolo della somma dei due elementi più grandi in una matrice
La query restituisce la somma dei primi 2 numeri pari (6 + 8 = 14) e la somma dei primi 2 numeri dispari (5 + 7 = 12).
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 |
Selezionare gli elementi nelle matrici
La query identifica i primi 2 elementi di ogni matrice dinamica in base ai valori Arr2 e li riepiloga in nuovi elenchi.
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] |
Uso with_itemindex
di per l'uso di un subset della matrice
La query restituisce una tabella con righe in cui l'indice è 3 o superiore, inclusi i valori dell'indice e degli elementi degli elenchi originali di numeri pari e dispari.
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
index | element |
---|---|
3 | 7 |
4 | 9 |
3 | 8 |
4 | 10 |
Uso di colonne mutiple per unire l'elemento di 2 matrici
La query combina gli elementi di due matrici dinamiche in un nuovo formato concatenato e quindi li riepiloga in elenchi.
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"] |
Applicazione di mv-apply a un contenitore di proprietà
Questa query rimuove in modo dinamico le proprietà dall'oggetto valori compressi in base ai criteri che i relativi valori non iniziano con "555". Il risultato finale contiene le colonne originali con proprietà indesiderate rimosse.
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 | valori |
---|---|---|---|
555-555-1234 | 555-555-1212 | 46 | { "SourceNumber": "555-555-1234", "TargetNumber": "555-555-1212" } |
555-555-1212 | { "SourceNumber": "555-555-1212" } |