cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
Syndicate_Admin
Administrator
Administrator

Consejos para filtrar datos grandes

Creé una medida que cuenta el estado más reciente para una transacción. Con esa medida, creé otra medida que calculará el valor total de $$$ usando la primera medida como contexto de filtro. Este valor de cálculo de medida se realizó correctamente con un pequeño conjunto de datos (Tabla = "Patrones" > aproximadamente 2.800 filas). Ahora que intenté usar la misma medida de valor con un conjunto de datos más grande (Tabla = "Todos los patrones" > aproximadamente 350.000 filas), el escritorio PBI procesará continuamente durante mucho tiempo sin ninguna salida. Ambos conjuntos de datos proceden del mismo origen.

¿Cuáles son sus mejores prácticas para filtrar datos de gran tamaño en sus medidas? A continuación se muestran las medidas a las que hago referencia y ejemplo PBIX en GitHub para el contexto. Cualquier consejo será muy apreciado.

PBIX en GitHub = Los valores de patrón cuentan PBIX

(Medida 1 = cuenta el estado más reciente para una transacción)

Pattern Count.ALLOppID = 
SUMX(
    SUMMARIZE(
       ALLSELECTED('All Patterns'),
        'All Patterns'[OPP_ID], "Date",MAX('All Patterns'[MIN_LAST_MODIFIED])
    ), IF(
        [Date] >= CALCULATE(MIN('All Patterns'[MIN_LAST_MODIFIED]) )
        && [Date] <= CALCULATE(MAX('All Patterns'[MIN_LAST_MODIFIED]) )
        ,1, BLANK()
    )
)

(Medida 2 = utiliza la medida 1 para calcular el valor total de $$$ utilizando la primera medida como contexto de filtro)

Pattern Value 2.ALL = 
CALCULATE(
    [Sum Value.ALL],
    FILTER(
        'All Patterns',
        [Pattern Count.ALLOppID]
    )
)

1 ACCEPTED SOLUTION
Syndicate_Admin
Administrator
Administrator

Está utilizando esencialmente la medida 1 como columna calculada en la medida 2. Una forma más eficaz de hacerlo sería definir una columna calculada con 1 si la transacción es la más reciente y en blanco de lo contrario. Almacenando esto como una columna calculada, sólo tenemos que hacerlo una vez y podemos reutilizarlo en múltiples medidas.

IsLastTransaction = 
IF (
    'All Patterns'[MIN_LAST_MODIFIED]
        = CALCULATE (
            MAX ( 'All Patterns'[MIN_LAST_MODIFIED] ),
            ALLEXCEPT ( 'All Patterns', 'All Patterns'[OPP_ID] )
        ),
    1
)

Ahora sus medidas se pueden simplificar en gran medida. El primero ni siquiera necesita usar la columna calculada:

Pattern Count.ALLOppID = DISTINCTCOUNT ( 'All Patterns'[OPP_ID] )

El segundo utiliza la columna calculada:

Pattern Value 2.ALL = 
CALCULATE(
    [Sum Value.ALL],
    'All Patterns'[IsLastTransaction] = 1
)

View solution in original post

5 REPLIES 5
Syndicate_Admin
Administrator
Administrator

Está utilizando esencialmente la medida 1 como columna calculada en la medida 2. Una forma más eficaz de hacerlo sería definir una columna calculada con 1 si la transacción es la más reciente y en blanco de lo contrario. Almacenando esto como una columna calculada, sólo tenemos que hacerlo una vez y podemos reutilizarlo en múltiples medidas.

IsLastTransaction = 
IF (
    'All Patterns'[MIN_LAST_MODIFIED]
        = CALCULATE (
            MAX ( 'All Patterns'[MIN_LAST_MODIFIED] ),
            ALLEXCEPT ( 'All Patterns', 'All Patterns'[OPP_ID] )
        ),
    1
)

Ahora sus medidas se pueden simplificar en gran medida. El primero ni siquiera necesita usar la columna calculada:

Pattern Count.ALLOppID = DISTINCTCOUNT ( 'All Patterns'[OPP_ID] )

El segundo utiliza la columna calculada:

Pattern Value 2.ALL = 
CALCULATE(
    [Sum Value.ALL],
    'All Patterns'[IsLastTransaction] = 1
)

View solution in original post

@AlexisOlson ¡Gracias! Tengo curiosidad sobre cómo una columna calculada funcionó tan bien en comparación con la medida. Siempre tuve la impresión de que las medidas debían considerarse primero. A pesar de todo, su consejo ayudó y proporcionó alivio a un problema estresante. ¡Tanta gratitud por su apoyo!

Su impresión es bastante precisa en general. Las columnas calculadas son una buena idea para situaciones en las que

  1. Los valores de columna no dependen del contexto de filtro. (Las columnas calculadas no son dinámicas.)
  2. Los valores de columna almacenan valores que de otro modo tendrían que calcularse repetidamente.

Con respecto a #1, tenga en cuenta que este enfoque no funcionaría si necesita filtrar las fechas con una segmentación de datos y encontrar la fecha máxima dentro de ese contexto de filtro. Si necesita esa flexibilidad, necesitaría todas las medidas (que todavía podrían ser mucho más eficientes que las que tenía).

Syndicate_Admin
Administrator
Administrator

Así que básicamente necesitas ser sabio con tu DAX. El código que está usando está obligando al motor a evaluar las cosas de cada fila individualmente (puede comprobarlo en dax studio). Por lo tanto, en general, desea evitarlo con conjuntos de datos grandes.

@JirkaZ Gracias por el consejo. Lo que estoy luchando es con el contexto actual de los requisitos es que tomo el estatus más reciente. Entiendo que es recomendable no evaluar cada fila individualmente, pero ¿cómo puedo estructurar la medida para hacerlo? Disculpas, pero estoy tan perdido.

Helpful resources

Announcements
PBI User Groups

Welcome to the User Group Public Preview

Check out new user group experience and if you are a leader please create your group

April Update

Check it Out!

Click here to read more about the April 2021 Updates!

MBAS Carousel

Sign up for our May 4th event!

May the fourth be with you, join us online!

secondImage

The largest Power BI virtual conference

100+ sessions, 100+ speakers, Product managers, MVPs, and experts. All about Power BI. Attend online or watch the recordings.