Undvik att använda FILTER som ett filterargument

Som datamodellerare är det vanligt att du skriver DAX-uttryck som måste utvärderas i en modifierad filterkontext. Du kan till exempel skriva en måttdefinition för att beräkna försäljningen för "produkter med hög marginal". Vi beskriver den här beräkningen senare i den här artikeln.

Kommentar

Den här artikeln är särskilt relevant för modellberäkningar som tillämpar filter på importtabeller.

DAX-funktionerna CALCULATE och CALCULATETABLE är viktiga och användbara funktioner. De låter dig skriva beräkningar som tar bort eller lägger till filter eller ändrar relationssökvägar. Det görs genom att skicka in filterargument, som antingen är booleska uttryck, tabelluttryck eller särskilda filterfunktioner. Vi diskuterar bara booleska uttryck och tabelluttryck i den här artikeln.

Överväg följande måttdefinition, som beräknar försäljning av röda produkter med hjälp av ett tabelluttryck. Det ersätter alla filter som kan tillämpas på tabellen Produkt .

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

Funktionen CALCULATE accepterar ett tabelluttryck som returneras av dax-funktionen FILTER , som utvärderar dess filteruttryck för varje rad i tabellen Produkt . Det uppnår rätt resultat – försäljningsresultatet för röda produkter. Det kan dock uppnås mycket effektivare med hjälp av ett booleskt uttryck.

Här är en förbättrad måttdefinition som använder ett booleskt uttryck i stället för tabelluttrycket. DAX-funktionen KEEPFILTERS ser till att alla befintliga filter som tillämpas på kolumnen Färg bevaras och inte skrivs över.

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

Vi rekommenderar att du skickar filterargument som booleska uttryck när det är möjligt. Det beror på att importmodelltabeller är minnesinterna kolumnlager. De är uttryckligen optimerade för att effektivt filtrera kolumner på det här sättet.

Det finns dock begränsningar som gäller för booleska uttryck när de används som filterargument. De:

  • Det går inte att referera till kolumner från flera tabeller
  • Det går inte att referera till ett mått
  • Det går inte att använda kapslade CALCULATE-funktioner
  • Det går inte att använda funktioner som söker igenom eller returnerar en tabell

Det innebär att du måste använda tabelluttryck för mer komplexa filterkrav.

Överväg nu en annan måttdefinition. Kravet är att beräkna försäljning, men bara för månader som har uppnått en vinst.

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

I det här exemplet måste funktionen FILTER användas. Det beror på att det kräver utvärdering av vinstmåttet för att eliminera de månader som inte gav någon vinst. Det går inte att använda ett mått i ett booleskt uttryck när det används som ett filterargument.

Rekommendationer

För bästa prestanda rekommenderar vi att du använder booleska uttryck som filterargument när det är möjligt.

Därför bör filterfunktionen endast användas när det behövs. Du kan använda den för att utföra filterkomplexa kolumnjämförelser. Dessa kolumnjämförelser kan omfatta: