Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
Syndicate_Admin
Administrator
Administrator

Optimización de la medida - Migración de segmentos

Hola a todos

Consulte el archivo adjunto para obtener soporte.

Tenemos un modelo simple de una mesa:

Customerid Fechas Segmento
6 03/01/2020 Segmento2
7 03/01/2020 Segmento2
6 03/02/2020 Segment1
7 03/02/2020 Segmento2
6 03/03/2020 Segment1
7 03/03/2020 Segment1

con información sobre a qué segmento pertenecían los clientes en fechas específicas. Construimos un objeto visual de matriz con Segmento en filas, Fechas en columnas y esta medida en valores:

Net new customers = 
VAR _CurrentDate =
    SELECTEDVALUE (Table1[Dates] )
VAR _PreviousDate =
    CALCULATE (
        MAX ( Table1[Dates] ),
        ALLSELECTED ( Table1[Dates] ),
        Table1[Dates] < _CurrentDate
    )
VAR _CustomerIDsThisMonth = DISTINCT(Table1[CustomerId]) 
VAR _CustomerIDsPreviousMonth =
    CALCULATETABLE (
        DISTINCT(Table1[CustomerId]),
        Table1[Dates] = _PreviousDate
    )
RETURN
    COUNTROWS(EXCEPT(_CustomerIDsThisMonth, _CustomerIDsPreviousMonth))

Esto proporciona el número de nuevos clientes que se movieron a ese segmento en esa fecha (a partir de la fecha anterior).

Esto funciona bien para un número bajo de clientes. Cuando eso aumenta, sin embargo, se vuelve bastante lento. Por ejemplo, con 1 millón de clientes e información sobre 10 fechas en la tabla, la medida tarda alrededor de 13 segundos en ejecutarse en el objeto visual. Si el número de clientes y fechas es mayor, como en el escenario real, es mucho más lento todavía.

¿Alguna idea sobre cómo optimizar esto, hacerlo más rápido?

Tenga en cuenta que puede cambiar el tamaño de la tabla cambiando el número de clientes y el número de períodos (fechas) en el editor de consultas. Simplemente edite los parámetros NumCustomers y NumPeriods.

@mahoneypat , @MFelix @TomMartens

1 ACCEPTED SOLUTION
Syndicate_Admin
Administrator
Administrator

No @AlB ,

probar esto.

Net new customers v2 = 
VAR _CurrentDate =
    SELECTEDVALUE (Table1[Dates] )
VAR _PreviousDate =
    CALCULATE (
        MAX ( Table1[Dates] ),
        ALLSELECTED ( Table1[Dates] ),
        Table1[Dates] < _CurrentDate
    )
VAR _CountCustomerIDsThisMonth =
    CALCULATE( 
        DISTINCTCOUNT(Table1[CustomerId]),
        Table1[Dates] = _PreviousDate ||
        Table1[Dates] = _CurrentDate
    )
VAR _CountCustomerIDsPreviousMonth =
    CALCULATE( 
        DISTINCTCOUNT(Table1[CustomerId]),
        Table1[Dates] = _PreviousDate
    )
RETURN
    _CountCustomerIDsThisMonth - _CountCustomerIDsPreviousMonth

View solution in original post

11 REPLIES 11
Syndicate_Admin
Administrator
Administrator

@mwegener

Muchas gracias por sus continuos esfuerzos. V5 muestra un poco de una mejora en los clientes de 1M, pero no es realmente significativo.

- [ Compra neta de nuevos clientes V5]: 21,5 segs

¿Tal vez hemos alcanzado el enfoque óptimo sin usar PQ o cambiar el modelo?

Gracias

Esto es muy posible.

Syndicate_Admin
Administrator
Administrator

@mwegener

Gracias por V4. Alternativa inteligente. Me temo que no funciona más rápido. Estas son las lecturas en DAX Studio con 1M clientes:

- [Compra neta de nuevos clientes]: 22,5 segs

- [ Net new customers purchases V2 ] : 25.7 secs

- [ Compra neta de nuevos clientes V4 ]: 23,7 segs

Así que no hay diferencias masivas. V4 realmente introduce un callback Data al final, pero eso no parece tener un gran efecto. Anteriormente afirmé que [Las compras netas de nuevos clientes V2] eran el doble de rápidos que [Las compras netas de nuevos clientes], pero no puedo reproducir eso ahora. Tal vez cometí un error de medición, fue con el analizador de rendimiento con PBI. Dax Studio debería ser más fiable

Gracias

No @AlB ,

probar esto.

Net new customers purchases V5 =
VAR _CurrentDate =
    SELECTEDVALUE ( Table1[Dates] )
VAR _PreviousDate =
    CALCULATE ( MAX ( Table1[Dates] ), Table1[Dates] < _CurrentDate )
VAR _NewCustomer =
    FILTER (
        VALUES ( Table1[CustomerId] ),
        VAR _CountPreviousCustomer =
            CALCULATE ( COUNT ( Table1[CustomerId] ), Table1[Dates] = _PreviousDate )
        VAR _IsInPreviousDate =
            _CountPreviousCustomer = BLANK ()
        RETURN
            _IsInPreviousDate
    )
RETURN
    CALCULATE ( SUM ( Table1[Sales] ), _NewCustomer )
Syndicate_Admin
Administrator
Administrator

@mwegener

Estoy principalmente interesado en una solución DAX, pero si no se puede optimizar más en DAX PQ es una opción también

Syndicate_Admin
Administrator
Administrator

@mwegener (y todos los demás)

Permítanme desafiarles un poco más. Consulte el archivo adjunto para obtener asistencia.

Ahora queremos calcular los ingresos (ventas) que han generado los nuevos clientes que se movieron al segmento. Para ello hemos añadido una columna adicional (Table1[Sales]). A continuación, tenemos un enfoque inicial, similar a [Net new customers]. Muy lento también:

Net new customers purchases = 
VAR _CurrentDate = SELECTEDVALUE ( Table1[Dates] )
VAR _PreviousDate = CALCULATE ( MAX ( Table1[Dates] ), Table1[Dates] < _CurrentDate )
VAR _CustomerIDsThisMonth = DISTINCT ( Table1[CustomerId] )
VAR _CustomerIDsPreviousMonth =
    CALCULATETABLE (
        DISTINCT ( Table1[CustomerId] ),
        Table1[Dates] = _PreviousDate
    )
RETURN
    CALCULATE (
        SUM ( Table1[Sales] ),
        EXCEPT ( _CustomerIDsThisMonth, _CustomerIDsPreviousMonth )
    )

Siguiendo un enfoque similar a @mwegener V2 (aunque no se puede seguir completamente en este caso), podemos hacerlo el doble de rápido, pero todavía relativamente lento:

Net new customers purchases V2 = 
VAR _CurrentDate = SELECTEDVALUE ( Table1[Dates] )
VAR _PreviousDate = CALCULATE ( MAX ( Table1[Dates] ), Table1[Dates] < _CurrentDate )
VAR _CustomerIDsThisMonth =
    CALCULATETABLE (
        DISTINCT ( Table1[CustomerId] ),
        Table1[Dates] = _PreviousDate || Table1[Dates] = _CurrentDate
    )
VAR _CustomerIDsPreviousMonth =
    CALCULATETABLE (
        DISTINCT ( Table1[CustomerId] ),
        Table1[Dates] = _PreviousDate
    )
RETURN
    CALCULATE ( SUM ( Table1[Sales] ), _CustomerIDsThisMonth )
        - CALCULATE ( SUM ( Table1[Sales] ), _CustomerIDsPreviousMonth )

¿Puedes hacerlo más rápido?

Muchas gracias

No @AlB ,

probar esto.

Net new customers V4 = 
VAR _CurrentDate =
    SELECTEDVALUE ( Table1[Dates] )
VAR _PreviousDate =
    CALCULATE ( MAX ( Table1[Dates] ), Table1[Dates] < _CurrentDate )
RETURN
    SUMX (
        Table1,
        IF (
            CALCULATE (
                COUNTROWS ( FILTER ( Table1, Table1[Dates] = _PreviousDate ) ),
                REMOVEFILTERS ( Table1[Dates] )
            ) >= 1,
            BLANK (),
            1
        )
    )

Net new customers purchases V4 = 
VAR _CurrentDate =
    SELECTEDVALUE ( Table1[Dates] )
VAR _PreviousDate =
    CALCULATE ( MAX ( Table1[Dates] ), Table1[Dates] < _CurrentDate )
RETURN
    SUMX (
        Table1,
        IF (
            CALCULATE (
                COUNTROWS ( FILTER ( Table1, Table1[Dates] = _PreviousDate ) ),
                REMOVEFILTERS ( Table1[Dates] )
            ) >= 1,
            BLANK (),
            Table1[Sales]
        )
    )

No @AlB,

¿podemos usar Power Query?

Syndicate_Admin
Administrator
Administrator

No @mwegener

Muchas gracias por sus respuestas. ¿Cómo no pensé en este enfoque 🙄 ?? V2 es mucho más rápido. ¡Gran!

Curiosamente, sin embargo, V3 es más lento que el original 🤔 que no esperaría ver el rendimiento de V2

Syndicate_Admin
Administrator
Administrator

No @AlB ,

probar esto.

Net new customers v2 = 
VAR _CurrentDate =
    SELECTEDVALUE (Table1[Dates] )
VAR _PreviousDate =
    CALCULATE (
        MAX ( Table1[Dates] ),
        ALLSELECTED ( Table1[Dates] ),
        Table1[Dates] < _CurrentDate
    )
VAR _CountCustomerIDsThisMonth =
    CALCULATE( 
        DISTINCTCOUNT(Table1[CustomerId]),
        Table1[Dates] = _PreviousDate ||
        Table1[Dates] = _CurrentDate
    )
VAR _CountCustomerIDsPreviousMonth =
    CALCULATE( 
        DISTINCTCOUNT(Table1[CustomerId]),
        Table1[Dates] = _PreviousDate
    )
RETURN
    _CountCustomerIDsThisMonth - _CountCustomerIDsPreviousMonth

HAY @AlB ,

dependiendo de los datos subyacentes, este ajuste también podría ayudar.

Net new customers v3 = 
VAR _CurrentDate =
    SELECTEDVALUE (Table1[Dates] )
VAR _PreviousDate =
    CALCULATE (
        MAX ( Table1[Dates] ),
        ALLSELECTED ( Table1[Dates] ),
        Table1[Dates] < _CurrentDate
    )
VAR _CountCustomerIDsThisMonth =
    CALCULATE( 
        SUMX(VALUES(Table1[CustomerId]),1),
        Table1[Dates] = _PreviousDate ||
        Table1[Dates] = _CurrentDate
    )
VAR _CountCustomerIDsPreviousMonth =
    CALCULATE( 
        SUMX(VALUES(Table1[CustomerId]),1),
        Table1[Dates] = _PreviousDate
    )
RETURN
    _CountCustomerIDsThisMonth - _CountCustomerIDsPreviousMonth

Lo obtuvo del vídeo Guy in a Cube "Depuración de un informe lento de Power BI con Phil Seamark"

https://www.youtube.com/watch?v=eABg872TAJU

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.