Undgå at bruge FILTER som et filterargument

Som dataudformer er det almindeligt at skrive 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 avance". Vi beskriver denne beregning senere i artiklen.

Bemærk

Denne artikel er især relevant for modelberegninger, der anvender filtre til import af tabeller.

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 overføre filterargumenter, der enten er booleske udtryk, tabeludtryk eller specielle filterfunktioner. Vi diskuterer kun booleske udtryk og tabeludtryk i denne artikel.

Overvej følgende målingsdefinition, som beregner røde produktsalg ved hjælp af et tabeludtryk. Det 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 finder det korrekte resultat – salgsresultatet for røde produkter. Det kan dog gøres 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 eventuelle eksisterende filtre, der er anvendt på kolonnen Farve, bevares og ikke overskrives.

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

Det anbefales, at du overfører filter argumenter som booleske udtryk, når det er muligt. Det skyldes, at tabeller af typen Importér model er gemte kolonnelagre. De er eksplicit optimeret til at filtrere kolonner på denne måde på en effektiv måde.

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

  • Kan ikke sammenlignes med andre kolonner
  • Kan ikke referere til en måling
  • Kan ikke bruge indlejrede funktioner af typen CALCULATE
  • Kan ikke bruge funktioner, der scanner eller returnerer en tabel

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

Overvej nu en anden målingsdefinition.

High Margin Product Sales =
CALCULATE(
    [Sales],
    FILTER(
        'Product',
        'Product'[ListPrice] > 'Product'[StandardCost] * 2
    )
)

Definitionen af et produkt med høj avance er et produkt, der har en listepris, der overskrider det dobbelte af standardomkostningerne. I dette eksempel skal funktionen Filter anvendes. Det skyldes, at filterudtrykket er for komplekst for et boolesk udtryk.

Her er et mere eksempel. Kravet denne gang 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 også anvendes. Det skyldes, at den kræver vurdering af målingen Profit for at udelukke de måneder, hvor der ikke opnås en fortjeneste. Det er ikke muligt at bruge en måling i et boolesk udtryk, når den bruges som et filterargument.

Anbefalinger

Det anbefales, at du bruger booleske udtryk som filter argumenter, når det er muligt, for at opnå den bedste ydeevne.

Derfor bør funktionen FILTER kun bruges, når det er nødvendigt. Du kan bruge den til at udføre filtrering af komplekse kolonnesammenligninger. Disse kolonnesammenligninger kan omfatte:

  • Målinger
  • Andre kolonner
  • Brug af DAX-funktionen OR eller den logiske operator OR (| |)

Se også