Udostępnij za pośrednictwem


operator mv-apply

Dotyczy: ✅Microsoft Fabric

Stosuje podzapytywanie do każdego rekordu i zwraca unię wyników wszystkich podzapytania.

Załóżmy na przykład, że tabela T ma kolumnę Metric typu dynamic , której wartości są tablicami real liczb. Poniższe zapytanie lokalizuje dwie największe wartości w każdej Metric wartości i zwraca rekordy odpowiadające tym wartościom.

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

Operator mv-apply ma następujące kroki przetwarzania:

  1. mv-expand Używa operatora do rozwijania każdego rekordu w danych wejściowych do podtabli (kolejność jest zachowywana).
  2. Stosuje podzapytywanie dla każdej z podtabli.
  3. Dodaje zero lub więcej kolumn do wynikowej tabeli podrzędnej. Te kolumny zawierają wartości kolumn źródłowych, które nie są rozwinięte i są powtarzane w razie potrzeby.
  4. Zwraca unię wyników.

Operator mv-apply pobiera następujące dane wejściowe:

  1. Co najmniej jedno wyrażenie, które ocenia w tablicach dynamicznych w celu rozwinięcia. Liczba rekordów w każdej rozwiniętej tabeli podrzędnej jest maksymalną długością każdej z tych tablic dynamicznych. Wartości null są dodawane, gdy określono wiele wyrażeń, a odpowiadające im tablice mają różne długości.

  2. Opcjonalnie nazwy do przypisania wartości wyrażeń po rozszerzeniu. Te nazwy stają się nazwami kolumn w podtabelach. Jeśli nie zostanie określona, oryginalna nazwa kolumny jest używana, gdy wyrażenie jest odwołaniem do kolumny. W przeciwnym razie jest używana losowa nazwa.

    Uwaga

    Zalecamy używanie domyślnych nazw kolumn.

  3. Typy danych elementów tych tablic dynamicznych po rozwinięciu. Te typy danych stają się typami kolumn w podtabelach. Jeśli nie zostanie określony, dynamic zostanie użyty.

  4. Opcjonalnie nazwa kolumny, która ma zostać dodana do podtabli, która określa 0-oparty na indeksie elementu w tablicy, co spowodowało utworzenie rekordu podtabli.

  5. Opcjonalnie maksymalna liczba elementów tablicy do rozwinięcia.

Operator mv-apply można traktować jako uogólnienie mv-expand operatora (w rzeczywistości ten ostatni może być implementowany przez ten pierwszy, jeśli podzapytywanie zawiera tylko projekcje).

Składnia

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

Gdzie element ItemIndex ma składnię:

with_itemindex = IndexColumnName

ColumnsToExpand to rozdzielana przecinkami lista co najmniej jednego elementu formularza:

[Name=] ArrayExpression [totypeof(Typename])

WierszLimit to po prostu:

limit Wierszlimit

SubQuery ma tę samą składnię dowolnej instrukcji zapytania.

Dowiedz się więcej na temat konwencji składni.

Parametry

Nazwisko Typ Wymagania opis
ItemIndex string Wskazuje nazwę kolumny typu long dołączonego do danych wejściowych w ramach fazy rozszerzania tablicy i wskazuje indeks tablicy rozszerzonej wartości na podstawie 0.
Name string Nazwa do przypisania wartości rozwiniętej tablicy każdego wyrażenia rozwiniętego tablicą. Jeśli nie zostanie określona, nazwa kolumny jest używana, jeśli jest dostępna. Losowa nazwa jest generowana, jeśli ArrayExpression nie jest prostą nazwą kolumny.
ArrayExpression dynamic ✔️ Tablica, której wartości są rozwinięte w tablicy. Jeśli wyrażenie jest nazwą kolumny w danych wejściowych, kolumna wejściowa zostanie usunięta z danych wejściowych i nowa kolumna o tej samej nazwie lub Nazwakolumny , jeśli zostanie określona, pojawi się w danych wyjściowych.
Typename string Nazwa typu, który przyjmują poszczególne elementy dynamic tablicy ArrayExpression . Elementy, które nie są zgodne z tym typem, są zastępowane wartością null. Jeśli nieokreślone, dynamic jest używany domyślnie.
RowLimit int Limit liczby rekordów do wygenerowania z każdego rekordu danych wejściowych. Jeśli nie określono, 2147483647 jest używana.
SubQuery string Wyrażenie zapytania tabelarycznego z niejawnym źródłem tabelarycznym, które jest stosowane do każdej tabeli rozwijanej tablicy.

Uwaga

mv-expand W przeciwieństwie do operatora operator mv-apply nie obsługuje bagexpand=array rozszerzania. Jeśli wyrażenie do rozwinięcia jest workiem właściwości, a nie tablicą, możesz użyć operatora wewnętrznego mv-expand (zobacz poniższy przykład).

Przykłady

Przejrzyj przykłady i uruchom je na stronie zapytania Eksploratora danych.

Pobieranie największego elementu z tablicy

Zapytanie zwraca najmniejszą liczbę parzystą (2) i najmniejszą liczbę nieparzystą (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
    )

Wyjście

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

Obliczanie sumy największych dwóch elementów w tablicy

Zapytanie zwraca sumę dwóch pierwszych parzystych liczb (6 + 8 = 14) i sumę dwóch pierwszych liczb nieparzyszonych (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)
    )

Wyjście

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

Wybieranie elementów w tablicach

Zapytanie identyfikuje dwa pierwsze elementy z każdej tablicy dynamicznej na podstawie wartości Arr2 i podsumowuje je na nowych listach.

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

Wyjście

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]

Używanie with_itemindex do pracy z podzbiorem tablicy

Zapytanie powoduje utworzenie tabeli z wierszami, w których indeks ma wartość 3 lub większą, w tym wartości indeksu i elementu z oryginalnych list parzystek i nieparzystek.

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

Wyjście

indeks — element
3 7
100 9
3 8
100 10

Używanie wielu kolumn do sprzężenia elementu dwóch tablic

Zapytanie łączy elementy z dwóch tablic dynamicznych w nowy format połączony, a następnie podsumowuje je na listach.

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

Wyjście

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

Stosowanie mv-apply do torby właściwości

To zapytanie dynamicznie usuwa właściwości z obiektu spakowanych wartości na podstawie kryteriów, których wartości nie zaczynają się od 555. Końcowy wynik zawiera oryginalne kolumny z usuniętymi niechcianymi właściwościami.

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

Wyjście

Numer źródła Numer docelowy CharsCount wartości
555-555-1234 555-555-1212 46 {
"SourceNumber": "555-555-1234",
"TargetNumber": "555-555-1212"
}
555-555-1212     {
"SourceNumber": "555-555-1212"
}