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.
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
Solved! Go to Solution.
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
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.
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 )
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
@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 @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
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
Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City
Check out the April 2024 Power BI update to learn about new features.
User | Count |
---|---|
1 | |
1 | |
1 | |
1 | |
1 |