Udostępnij za pośrednictwem


Unikaj używania FILTER jako argumentu filtru

Jako modelarz danych często piszesz wyrażenia DAX, które muszą być ewaluowane 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.

Notatka

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

Funkcje CALCULATE i CALCULATETABLEDAX 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 tabelaryczne.

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ą być stosowane do tabeli Product.

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

Funkcja CALCULATE akceptuje wyrażenie tabeli zwrócone przez funkcję FILTERDAX, 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 to 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 KEEPFILTERSDAX zapewnia, ż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. Oni:

  • 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ęły 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 przeprowadzania złożonych porównań kolumn za pomocą filtrowania. Te porównania kolumn mogą obejmować:

  • Środki
  • Inne kolumny
  • Korzystanie z funkcji ORDAX lub operatora logicznego OR (||)