Undvik att använda FILTER som ett filterargument
Som datamodellerare skriver du ofta DAX-uttryck som måste utvärderas i en ändrad 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 artikeln.
Anteckning
Den här artikeln är särskilt relevant för modellberäkningar där filter används till att importera tabeller.
DAX-funktionerna CALCULATE och CALCULATETABLE är viktiga och användbara funktioner. De gör att du kan skriva beräkningar som tar bort eller lägger till filter, eller ändrar relationsvägar. Du gör det genom att skicka filterargument som antingen är booleska uttryck, tabelluttryck eller särskilda filterfunktioner. I den här artikeln tar vi bara upp booleska uttryck och tabelluttryck.
Tänk dig följande måttdefinition, som beräknar försäljningen av röda produkter med hjälp av ett tabelluttryck. Den ersätter alla filter som tillämpas på tabellen Product.
Red Sales =
CALCULATE(
[Sales],
FILTER('Product', 'Product'[Color] = "Red")
)
Funktionen CALCULATE tar emot ett tabelluttryck som returneras av DAX-funktionen FILTER, som utvärderar filteruttrycket för varje rad i tabellen Product. Det här ger rätt resultat – försäljningsresultatet för röda produkter. Du kan dock göra det här mycket mer effektivt genom att använda ett booleskt uttryck.
Här är en bättre måttdefinition som använder ett booleskt uttryck i stället för tabelluttrycket. DAX-funktionen KEEPFILTERS ser till att befintliga filter som används i Color-kolumnen 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 tabeller för modellimport är kolumnlager i minnet. De är uttryckligen optimerade för att effektivt filtrera kolumner på det här sättet.
Det finns dock begränsningar som gäller när booleska uttryck används som filter argument. Här är några av dem:
- de kan inte jämföra kolumner med andra kolumner
- de kan inte referera till ett mått
- de kan inte använda kapslade CALCULATE-funktioner
- de kan inte använda funktioner som skannar eller returnerar en tabell.
Det här innebär att du måste använda tabelluttryck för mer komplicerade filtreringsbehov.
Tänk dig nu en annan måttdefinition.
High Margin Product Sales =
CALCULATE(
[Sales],
FILTER(
'Product',
'Product'[ListPrice] > 'Product'[StandardCost] * 2
)
)
Definitionen av en produkt med hög marginal är en som har ett försäljningspris högre än dubbla standardkostnaden. I det här exemplet måste du använda funktionen FILTER. Det beror på att filteruttrycket är för komplicerat för ett booleskt uttryck.
Här är ett exempel till. Den här gången ska du beräkna försäljningen, men bara för de månader som har uppnått vinst.
Sales for Profitable Months =
CALCULATE(
[Sales],
FILTER(
VALUES('Date'[Month]),
[Profit] > 0)
)
)
I det här exemplet måste du också använda funktionen FILTER. Det beror på att du måste utvärdera måttet Profit för att eliminera de månader som inte uppnådde någon en vinst. Du kan inte använda mått i ett booleskt uttryck när det används som 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 ska du bara använda funktionen FILTER när du måste. Du kan använda den till att filtrera komplexa kolumnjämförelser. Här är några exempel på vad sådana jämförelser kan innehålla:
- Mått
- Andra kolumner
- DAX-funktionen OR eller den logiska operatorn OR (||)
Se även
- Filterfunktioner (DAX)
- Utbildningsväg: Använda DAX i Power BI Desktop
- Har du några frågor? Fråga Power BI Community
- Har du förslag? Bidra till att förbättra Power BI