Udostępnij za pośrednictwem


Unikanie używania wartości FILTER jako argumentu filtru

Jako modeler danych często piszesz wyrażenia języka DAX, które muszą być oceniane w zmodyfikowanym kontekście filtru. Możesz na przykład napisać definicję miary, aby obliczyć sprzedaż dla "produktów o wysokiej marży". W dalszej części tego artykułu opiszemy to obliczenie.

Uwaga

Ten artykuł jest szczególnie istotny w przypadku obliczeń modelu, które stosują filtry do tabel importu.

Funkcje JĘZYKA DAX CALCULATE i CALCULATETABLE są ważne i przydatne. Umożliwiają one pisanie obliczeń, które usuwają lub dodają filtry albo modyfikują ścieżki relacji. Odbywa się to przez przekazanie argumentów filtru, które są wyrażeniami logicznymi, wyrażeniami tabeli lub specjalnymi funkcjami filtru. W tym artykule omówimy tylko wyrażenia logiczne i wyrażenia tabeli.

Rozważmy następującą definicję miary, która oblicza sprzedaż produktu czerwonego przy użyciu wyrażenia tabeli. Spowoduje to zastąpienie wszystkich filtrów, które mogą zostać zastosowane do tabeli Product .

Red Sales =
CALCULATE(
    [Sales],
    FILTER('Product', 'Product'[Color] = "Red")
)

Funkcja CALCULATE akceptuje wyrażenie tabeli zwracane przez funkcję JĘZYKA DAX FILTER , która oblicza wyrażenie filtru dla każdego wiersza tabeli Product . Osiąga prawidłowy wynik — wynik sprzedaży dla produktów czerwonych. Można go jednak osiągnąć znacznie wydajniej, używając wyrażenia logicznego.

Oto ulepszona definicja miary, która używa wyrażenia logicznego zamiast wyrażenia tabeli. Funkcja KEEPFILTERS języka DAX gwarantuje, że wszystkie istniejące filtry zastosowane do kolumny Color zostaną zachowane i nie zostaną zastąpione.

Red Sales =
CALCULATE(
    [Sales],
    KEEPFILTERS('Product'[Color] = "Red")
)

Zaleca się przekazywanie argumentów filtru jako wyrażeń logicznych, jeśli jest to możliwe. Jest to spowodowane tym, że tabele modelu importu są magazynami kolumn w pamięci. Są one jawnie zoptymalizowane pod kątem wydajnego filtrowania kolumn w ten sposób.

Istnieją jednak ograniczenia, które mają zastosowanie do wyrażeń logicznych, gdy są używane jako argumenty filtru. Są to:

  • Nie można odwoływać się do kolumn z wielu tabel
  • Nie można odwołać się do miary
  • Nie można używać zagnieżdżonych funkcji CALCULATE
  • Nie można używać funkcji, które skanują lub zwracają tabelę

Oznacza to, że musisz użyć wyrażeń tabeli w celu uzyskania bardziej złożonych wymagań filtru.

Rozważ teraz inną definicję miary. Wymaganie polega na obliczeniu sprzedaży, ale tylko przez miesiące, które osiągnęły zysk.

Sales for Profitable Months =
CALCULATE(
    [Sales],
    FILTER(
        VALUES('Date'[Month]),
        [Profit] > 0)
    )
)

W tym przykładzie należy użyć funkcji FILTER. Jest to spowodowane tym, że wymaga oceny miary Profit w celu wyeliminowania tych miesięcy, które nie osiągną zysku. Nie można użyć miary w wyrażeniu logicznym, gdy jest używana jako argument filtru.

Zalecenia

Aby uzyskać najlepszą wydajność, zaleca się używanie wyrażeń logicznych jako argumentów filtru, jeśli jest to możliwe.

W związku z tym funkcja FILTER powinna być używana tylko w razie potrzeby. Można go użyć do wykonywania filtru złożonych porównań kolumn. Te porównania kolumn mogą obejmować: