Delen via


Vermijd het gebruik van FILTER als filterargument

Als gegevensmodeller schrijft u vaak DAX expressies die moeten worden geëvalueerd in een gewijzigde filtercontext. U kunt bijvoorbeeld een metingdefinitie schrijven om de verkoop te berekenen voor 'producten met hoge marge'. Deze berekening wordt verderop in dit artikel beschreven.

Notitie

Dit artikel is met name relevant voor modelberekeningen die filters toepassen op Import-tabellen.

De functies CALCULATE en CALCULATETABLEDAX zijn belangrijke en nuttige functies. Hiermee kunt u berekeningen schrijven waarmee u filters verwijdert of toevoegt of relatiepaden wijzigt. Dit wordt gedaan door filterargumenten door te geven. Dit zijn Booleaanse expressies, tabelexpressies of speciale filterfuncties. In dit artikel worden alleen Booleaanse expressies en tabelexpressies besproken.

Bekijk de volgende metingsdefinitie, waarmee de verkoop van rode producten wordt berekend met behulp van een tabelexpressie. Hiermee worden alle filters vervangen die kunnen worden toegepast op de tabel Product.

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

De functie CALCULATE accepteert een tabelexpressie die wordt geretourneerd door de functie FILTERDAX, waarmee de filterexpressie wordt geëvalueerd voor elke rij van de tabel Product. Het haalt het juiste resultaat op: het verkoopresultaat voor rode producten. Het kan echter veel efficiënter worden bereikt met behulp van een Boole-expressie.

Hier volgt een verbeterde metingsdefinitie, die gebruikmaakt van een Boole-expressie in plaats van de tabelexpressie. De functie KEEPFILTERSDAX zorgt ervoor dat alle bestaande filters die zijn toegepast op de kolom Kleur, behouden blijven en niet worden overschreven.

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

Het is raadzaam om waar mogelijk filterargumenten door te geven als Boole-expressies. Dit komt doordat modeltabellen importeren in het geheugen kolomarchieven zijn. Ze zijn expliciet geoptimaliseerd om op deze manier kolommen efficiënt te filteren.

Er zijn echter beperkingen die van toepassing zijn op Boole-expressies wanneer ze worden gebruikt als filterargumenten. Zij:

  • Kan niet verwijzen naar kolommen uit meerdere tabellen
  • Kan niet verwijzen naar een meting
  • Kan geneste CALCULATE-functies niet gebruiken
  • Kan geen functies gebruiken die een tabel scannen of retourneren

Dit betekent dat u tabelexpressies moet gebruiken voor complexere filtervereisten.

Overweeg nu een andere metingsdefinitie. De vereiste is om de verkoop te berekenen, maar alleen voor maanden die een winst hebben behaald.

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

In dit voorbeeld moet de functie FILTER worden gebruikt. Dit komt doordat het evalueren van de Profit maatstaf nodig is om die maanden te elimineren die geen winst behaalden. Het is niet mogelijk om een meting te gebruiken in een Boole-expressie wanneer deze wordt gebruikt als filterargument.

Aanbevelingen

Voor de beste prestaties is het raadzaam booleaanse expressies te gebruiken als filterargumenten, indien mogelijk.

Daarom mag de functie FILTER alleen worden gebruikt wanneer dat nodig is. U kunt deze gebruiken om complexe kolomvergelijkingen te filteren. Deze kolomvergelijkingen kunnen betrekking hebben op:

  • Maatregelen
  • Andere kolommen
  • De functie ORDAX of de logische operator voor OR (||) gebruiken