Acción de código DI005 (Mejora) Reescribir el filtro de tabla con FILTER como predicado escalar
Descripción
Reescribe los argumentos de filtro de CALCULATE como predicados escalares siempre que sea posible, en vez de usar la función FILTER.
Ejemplo 1
Cambiar:
CALCULATE([Total Sales], FILTER(Products, Products[Color] = "Red"))
A:
CALCULATE([Total Sales], KEEPFILTERS(Products[Color] = "Red"))
Ejemplo 2
Cambiar:
CALCULATE([Total Sales], FILTER(ALL(Products), Products[Color] = "Red"))
A:
CALCULATE([Total Sales], ALL(Products), Products[Color] = "Red")
Ejemplo 3
Cambiar:
CALCULATE(
[Total Sales],
FILTER(
ALL(Products),
Products[Color] = "Red"
&& Products[Class] = "High-end"
)
)
A:
CALCULATE(
[Total Sales],
ALL(Products),
Products[Color] = "Red",
Products[Class] = "High-end"
)
¿Por qué Tabular Editor sugiere esto?
Filtrar una tabla dentro de un argumento de filtro de CALCULATE es menos eficiente que filtrar una o varias columnas de esa tabla. Al reescribir el filtro como un predicado escalar, haces que tu código sea más eficiente, ya que consume menos memoria y recursos de CPU.
Por ejemplo, una expresión como FILTER(Sales, < condition >) iterará sobre todas las filas de la tabla Sales y evaluará la condición en cada fila. En cambio, una expresión como Sales[Quantity] > 0 solo iterará sobre la columna Quantity, lo cual es mucho más eficiente, y no hace que todas las columnas de la tabla Sales se agreguen al contexto de filtro.
Al usar predicados escalares, también haces que tu código sea más conciso y más fácil de leer.
En segundo plano, los predicados escalares son una simplificación sintáctica de una expresión de tabla que también usa la función FILTER. Sin embargo, la función FILTER se aplica a una sola columna, lo cual es más eficiente que filtrar la tabla completa.
Cuando no se muestra esta sugerencia
A partir de Tabular Editor 3.25.0, esta acción de código no se sugiere cuando se produce una expansión de tabla en la expresión FILTER. Esto se debe a que reescribir un filtro de tabla como un predicado escalar puede cambiar la semántica del filtro y producir resultados distintos en esos casos.
Escenario de expansión de tabla
La expansión de tabla ocurre cuando DAX incluye automáticamente tablas relacionadas en el lado "uno" de una relación. Por ejemplo, si filtras la tabla Sales, DAX amplía automáticamente el filtro para incluir tablas de dimensión relacionadas como Product, Customer, etc.
Cuando escribes:
CALCULATE(
[Total Sales],
FILTER(Sales, Sales[Quantity] > 10)
)
El filtro opera sobre la tabla Sales expandida, que incluye todas las tablas de dimensiones relacionadas. Esto significa que el contexto de filtro incluye no solo la tabla Sales, sino también cualquier tabla del lado "uno" de las relaciones que parten de Sales.
Por qué reescribirlo puede cambiar los resultados
Convertir un filtro de tabla en un predicado escalar cambia qué tablas se ven afectadas:
Original (con expansión de tabla):
CALCULATE([Total Sales], FILTER(Sales, Sales[Quantity] > 10))
Esto filtra la tabla Sales expandida y afecta a Sales y a todas las tablas de dimensiones relacionadas.
Después de reescribirlo (predicado escalar):
CALCULATE([Total Sales], Sales[Quantity] > 10)
Esto filtra solo la columna Sales[Quantity], lo cual no desencadena la expansión de tabla hacia las tablas de dimensiones relacionadas.
En la mayoría de los casos, esta diferencia no importa porque las tablas de dimensiones relacionadas no afectan al cálculo. Sin embargo, en determinados escenarios, especialmente cuando intervienen relaciones o tablas calculadas, las dos expresiones pueden producir resultados diferentes. Para garantizar la corrección, Tabular Editor evita sugerir esta reescritura cuando se detecta la expansión de tablas.
Lecturas adicionales
- SQLBI: Tablas expandidas en DAX - Una explicación completa de cómo funciona la expansión de tablas y sus implicaciones para el contexto de filtro.