DAX: Vyhnutí se použití možnosti FILTER jako argumentu filtruDAX: Avoid using FILTER as a filter argument

Při modelování dat je běžné, že napíšete výrazy DAX, které je potřeba vyhodnotit v upraveném kontextu filtru.As a data modeler, it's common you'll write DAX expressions that need to be evaluated in a modified filter context. Můžete například napsat definici míry pro výpočet prodeje „produktů s vysokou marží“.For example, you can write a measure definition to calculate sales for "high margin products". Tento výpočet popíšeme dále v tomto článku.We'll describe this calculation later in this article.

Poznámka

Tento článek je zvláště důležitý pro výpočty modelů, které používají filtry pro tabulky importu.This article is especially relevant for model calculations that apply filters to Import tables.

Funkce CALCULATE a CALCULATETABLE jazyka DAX jsou důležité a užitečné funkce.The CALCULATE and CALCULATETABLE DAX functions are important and useful functions. Umožňují vám psát výpočty, které odstraňují nebo přidávají filtry nebo upravují cesty relací.They let you write calculations that remove or add filters, or modify relationship paths. Děje se to předáním argumentů filtru, což jsou buď logické výrazy, výrazy tabulky nebo speciální funkce filtru.It's done by passing in filter arguments, which are either Boolean expressions, table expressions, or special filter functions. V tomto článku se budeme zabývat pouze logickými výrazy a výrazy tabulky.We'll only discuss Boolean and table expressions in this article.

Podívejte se na následující definici míry, která počítá prodej červených produktů pomocí výrazu tabulky.Consider the following measure definition, which calculates red product sales by using a table expression. Nahradí všechny filtry, které by mohly být použity pro tabulku Product (Produkt).It will replace any filters that might be applied to the Product table.

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

Funkce CALCULATE přijme výraz tabulky vrácený funkcí FILTER jazyka DAX, která vyhodnocuje svůj výraz filtru pro každý řádek tabulky Product.The CALCULATE function accepts a table expression returned by the FILTER DAX function, which evaluates its filter expression for each row of the Product table. Dosahuje správného výsledku – výsledek prodeje červených produktů.It achieves the correct result—the sales result for red products. Toho však lze dosáhnout mnohem efektivněji pomocí logického výrazu.However, it could be achieved much more efficiently by using a Boolean expression.

Zde je vylepšená definice míry, která místo výrazu tabulky používá logický výraz.Here's an improved measure definition, which uses a Boolean expression instead of the table expression. Funkce KEEPFILTERS jazyka DAX zajišťuje, že všechny existující filtry použité ve sloupci Color zůstanou zachovány a nepřepíší se.The KEEPFILTERS DAX function ensures any existing filters applied to the Color column are preserved, and not overwritten.

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

Doporučujeme předávat argumenty filtru jako logické výrazy, kdykoli je to možné.We recommend you pass filter arguments as Boolean expressions, whenever possible. Je to proto, že tabulky importu modelu jsou úložiště sloupců v paměti.It's because Import model tables are in-memory column stores. Jsou explicitně optimalizovány tak, aby účinně filtrovaly sloupce tímto způsobem.They are explicitly optimized to efficiently filter columns in this way.

Pro logické výrazy, které jsou použity jako argumenty filtru, však platí určitá omezení,There are, however, restrictions that apply to Boolean expressions when they're used as filter arguments. a sice:They:

  • Sloupce nelze porovnávat s jinými sloupci.Cannot compare columns to other columns
  • Nelze odkazovat na míru.Cannot reference a measure
  • Nelze použít vnořené funkce CALCULATE.Cannot use nested CALCULATE functions
  • Nelze použít funkce, které prohledávají nebo vracejí tabulku.Cannot use functions that scan or return a table

To znamená, že pro složitější požadavky na filtr budete muset použít výrazy tabulky.It means that you'll need to use table expressions for more complex filter requirements.

Podívejme se nyní na jinou definici míry.Consider now a different measure definition.

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

Z definice produktu s vysokou marží plyne, že se jedná o produkt, který má ceníkovou cenu vyšší než dvojnásobek standardních nákladů.The definition of a high margin product is one that has a list price exceeding double its standard cost. V tomto příkladu musí být použita funkce FILTR.In this example, the FILTER function must be used. Je to proto, že výraz filtru je pro logický výraz příliš složitý.It's because the filter expression is too complex for a Boolean expression.

Tady je další příklad.Here's one more example. Požadavkem je tentokrát spočítat prodej, ale pouze pro měsíce, ve kterých byl dosažen zisk.The requirement this time is to calculate sales, but only for months that have achieved a profit.

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

V tomto příkladu musí být také použita funkce FILTR.In this example, the FILTER function must also be used. Je to proto, že se vyžaduje vyhodnocení míry Profit, aby byly eliminovány měsíce, ve kterých nebyl dosažen zisk.It's because it requires evaluating the Profit measure to eliminate those months that didn't achieve a profit. Není možné použít míru v logickém výrazu, pokud je použita jako argument filtru.It's not possible to use a measure in a Boolean expression when it's used as a filter argument.

DoporučeníRecommendations

Pro dosažení nejlepšího výkonu doporučujeme použít logické výrazy jako argumenty filtru, kdykoli je to možné.For best performance, we recommend you use Boolean expressions as filter arguments, whenever possible.

Funkce FILTER by proto měla být použita pouze v případě potřeby.Therefore, the FILTER function should only be used when necessary. Můžete ji použít k filtrování složitých porovnání sloupců.You can use it to perform filter complex column comparisons. Tato porovnání sloupců mohou zahrnovat:These column comparisons can involve:

  • MíryMeasures
  • Jiné sloupceOther columns
  • Použití funkce OR jazyka DAX nebo logického operátoru OR (||)Using the OR DAX function, or the OR logical operator (||)

Další krokyNext steps

Další informace k tomuto článku najdete v následujících tématech:For more information about this article, check out the following resources: