mv-apply, opérateur
Applique une sous-requête à chaque enregistrement et retourne l’union des résultats de toutes les sous-requêtes.
Par exemple, supposons qu’une table T
possède une colonne Metric
de type dynamic
dont les valeurs sont des tableaux de real
nombres. La requête suivante localise les deux plus grandes valeurs dans chaque Metric
valeur et retourne les enregistrements correspondant à ces valeurs.
T | mv-apply Metric to typeof(real) on
(
top 2 by Metric desc
)
L’opérateur mv-apply
a les étapes de traitement suivantes :
- Utilise l’opérateur
mv-expand
pour développer chaque enregistrement de l’entrée dans des sous-tableaux (l’ordre est conservé). - Applique la sous-requête pour chacune des sous-tables.
- Ajoute zéro ou plusieurs colonnes à la sous-table résultante. Ces colonnes contiennent les valeurs des colonnes sources qui ne sont pas développées et sont répétées si nécessaire.
- Retourne l’union des résultats.
L’opérateur mv-apply
obtient les entrées suivantes :
Une ou plusieurs expressions qui s’évaluent en tableaux dynamiques à développer. Le nombre d’enregistrements dans chaque sous-tableau développé correspond à la longueur maximale de chacun de ces tableaux dynamiques. Les valeurs Null sont ajoutées lorsque plusieurs expressions sont spécifiées et que les tableaux correspondants ont des longueurs différentes.
Si vous le souhaitez, les noms à attribuer aux valeurs des expressions après l’expansion. Ces noms deviennent les noms de colonnes dans les sous-tables. S’il n’est pas spécifié, le nom d’origine de la colonne est utilisé lorsque l’expression est une référence de colonne. Un nom aléatoire est utilisé dans le cas contraire.
Notes
Il est recommandé d’utiliser les noms de colonnes par défaut.
Types de données des éléments de ces tableaux dynamiques, après l’expansion. Ceux-ci deviennent les types de colonnes des colonnes dans les sous-tables. En l'absence de spécification,
dynamic
est utilisé.Éventuellement, nom d’une colonne à ajouter aux sous-tables qui spécifie l’index de base 0 de l’élément dans le tableau qui a abouti à l’enregistrement de sous-table.
Si vous le souhaitez, le nombre maximal d’éléments de tableau à développer.
L’opérateur mv-apply
peut être considéré comme une généralisation de l’opérateur mv-expand
(en fait, ce dernier peut être implémenté par le premier, si la sous-requête inclut uniquement des projections).)
Syntax
T|
mv-apply
[ItemIndex] ColumnsToExpand [RowLimit] on
(
SubQuery)
Où ItemIndex a la syntaxe :
with_itemindex
=
IndexColumnName
ColumnsToExpand est une liste séparée par des virgules d’un ou plusieurs éléments du formulaire :
[Nom=
] ArrayExpression [to
typeof
(
Typename)
]
RowLimit est simplement :
limit
RowLimit
et SubQuery a la même syntaxe que n’importe quelle instruction de requête.
Découvrez les conventions de syntaxe.
Paramètres
Nom | Type | Obligatoire | Description |
---|---|---|---|
ItemIndex | string |
Indique le nom d’une colonne de type long qui est ajoutée à l’entrée dans le cadre de la phase d’expansion du tableau et indique l’index de tableau de base 0 de la valeur développée. |
|
Nom | string |
Nom à attribuer aux valeurs développées par le tableau de chaque expression développée par le tableau. S’il n’est pas spécifié, le nom de la colonne est utilisé s’il est disponible. Un nom aléatoire est généré si ArrayExpression n’est pas un nom de colonne simple. | |
ArrayExpression | dynamic |
✔️ | Tableau dont les valeurs sont développées par le tableau. Si l’expression est le nom d’une colonne dans l’entrée, la colonne d’entrée est supprimée de l’entrée et une nouvelle colonne du même nom, ou ColumnName si elle est spécifiée, apparaît dans la sortie. |
Typename | string |
Nom du type que prennent les éléments individuels du dynamic tableau ArrayExpression . Les éléments qui ne sont pas conformes à ce type sont remplacés par une valeur null. S’il n’est pas spécifié, dynamic est utilisé par défaut. |
|
RowLimit | int |
Limite du nombre d’enregistrements à générer à partir de chaque enregistrement de l’entrée. S’il n’est pas spécifié, 2147483647 est utilisé. | |
Sous-requête | string |
Expression de requête tabulaire avec une source tabulaire implicite qui est appliquée à chaque sous-tableau étendu au tableau. |
Notes
Contrairement à l’opérateur mv-expand
, l’opérateur mv-apply
ne prend pas en charge bagexpand=array
l’expansion. Si l’expression à développer est un conteneur de propriétés et non un tableau, vous pouvez utiliser un opérateur interne mv-expand
(voir l’exemple ci-dessous).
Exemples
Obtention du plus grand élément à partir du tableau
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
)
Sortie
xMod2 |
l | element |
---|---|---|
1 | [1, 3, 5, 7] | 7 |
0 | [2, 4, 6, 8] | 8 |
Calcul de la somme des deux plus grands éléments d’un tableau
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)
)
Sortie
xMod2 |
l | SumOfTop2 |
---|---|---|
1 | [1,3,5,7] | 12 |
0 | [2,4,6,8] | 14 |
Sélectionner des éléments dans des tableaux
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)
)
Sortie
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] |
Utilisation with_itemindex
pour travailler avec un sous-ensemble du tableau
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
Sortie
index | element |
---|---|
3 | 7 |
4 | 9 |
3 | 8 |
4 | 10 |
Utilisation de colonnes mutiple pour joindre un élément de 2 tableaux
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)
)
Sortie
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"] |
Application de mv-apply à un conteneur de propriétés
Dans l’exemple suivant, mv-apply
est utilisé en combinaison avec un interne mv-expand
pour supprimer des valeurs qui ne commencent pas par « 555 » d’un conteneur de propriétés :
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
Sortie
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 » } |
Contenu connexe
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour