Del via


Undgå at bruge FILTER som et filterargument

Som dataudformer er det almindeligt, at du skriver DAX-udtryk, der skal evalueres i en ændret filterkontekst. Du kan f.eks. skrive en målingsdefinition for at beregne salg for "produkter med høj margen". Vi beskriver denne beregning senere i denne artikel.

Bemærk

Denne artikel er især relevant for modelberegninger, der anvender filtre på importtabeller.

DAX-funktionerne CALCULATE og CALCULATETABLE er vigtige og nyttige funktioner. De giver dig mulighed for at skrive beregninger, der fjerner eller tilføjer filtre eller ændrer relationsstier. Det gøres ved at angive filterargumenter, som enten er booleske udtryk, tabeludtryk eller særlige filterfunktioner. Vi diskuterer kun booleske udtryk og tabeludtryk i denne artikel.

Overvej følgende målingsdefinition, som beregner salg af røde produkter ved hjælp af et tabeludtryk. Den erstatter eventuelle filtre, der kan anvendes på tabellen Product .

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

Funktionen CALCULATE accepterer et tabeludtryk, der returneres af DAX-funktionen FILTER , som evaluerer filterudtrykket for hver række i tabellen Product . Det opnår det korrekte resultat – salgsresultatet for røde produkter. Det kan dog opnås meget mere effektivt ved hjælp af et boolesk udtryk.

Her er en forbedret målingsdefinition, som bruger et boolesk udtryk i stedet for tabeludtrykket. DAX-funktionen KEEPFILTERS sikrer, at alle eksisterende filtre, der er anvendt på kolonnen Color, bevares og ikke overskrives.

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

Det anbefales, at du overfører filterargumenter som booleske udtryk, når det er muligt. Det skyldes, at importmodeltabeller er kolonnelagre i hukommelsen. De er eksplicit optimeret til effektivt at filtrere kolonner på denne måde.

Der er dog begrænsninger, der gælder for booleske udtryk, når de bruges som filterargumenter. De:

  • Kolonner fra flere tabeller kan ikke refereres til
  • Der kan ikke refereres til en måling
  • Der kan ikke bruges indlejrede CALCULATE-funktioner
  • Kan ikke bruge funktioner, der scanner eller returnerer en tabel

Det betyder, at du skal bruge tabeludtryk til mere komplekse filterkrav.

Overvej nu en anden målingsdefinition. Kravet er at beregne salg, men kun for måneder, der har opnået en fortjeneste.

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

I dette eksempel skal funktionen FILTER bruges. Det skyldes, at det kræver evaluering af målingen Profit for at eliminere de måneder, der ikke opnåede en fortjeneste. Det er ikke muligt at bruge en måling i et boolesk udtryk, når den bruges som et filterargument.

Anbefalinger

For at opnå den bedste ydeevne anbefales det, at du bruger booleske udtryk som filterargumenter, når det er muligt.

Funktionen FILTER bør derfor kun bruges, når det er nødvendigt. Du kan bruge den til at udføre filterkomplekse kolonnesammenligninger. Disse kolonnesammenligninger kan omfatte: