Dela via


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.

Not

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

Funktionerna CALCULATE och CALCULATETABLEDAX ä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 Product.

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

Funktionen CALCULATE accepterar ett tabelluttryck som returneras av funktionen FILTERDAX, som utvärderar dess filteruttryck för varje rad i tabellen Product. 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. Funktionen KEEPFILTERSDAX ser till att alla befintliga filter som tillämpas på kolumnen Color 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 måttet Profit för att eliminera de månader som inte gick med 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 funktionen FILTER 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:

  • Åtgärder
  • Andra kolumner
  • Använda funktionen ORDAX eller den OR logiska operatorn (||)