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
dpc_development
Helper III
Helper III

Optimización de DAX - Recuento diferenciado entre dos fechas

No tengo acceso para transformar los datos y debo utilizar una medida para satisfacer las siguientes necesidades.

Tengo una tabla llamada 'Detalles de la actividad' con una columna de ID denominada [ID de usuario de la solución] y una columna de fecha denominada [Fecha del evento]. Actualmente hay alrededor de 800k filas.

Cada vez que el usuario realiza una acción, hay una fila creada en esta tabla. Necesito calcular cuántos usuarios estuvieron activos en los últimos 12 meses, dada una fecha en particular, y también poner esto en un gráfico de líneas.

La siguiente medida funciona, pero es extremadamente lenta. Al analizar en DAX studio, noto que para cada fecha, ejecuta una consulta de Storage Engine. Probé una combinación de SUMX y la fórmula SUMMARIZE también, y aunque eso redujo el número de consultas SE, todavía era aproximadamente la misma velocidad debido al procesamiento de un gran número de filas.

Active Users = 
var latestDate = MAX('Calendar'[Date])
RETURN
CALCULATE(
DISTINCTCOUNT('Activity Details'[Solution User ID]),
ALL('Calendar'[Date]),
'Activity Details'[Event Date] <= latestDate,
'Activity Details'[Event Date] >= latestDate - 365
)


Apreciaría si alguien puede sugerir una mejor fórmula.

7 REPLIES 7
Ashish_Mathur
Super User
Super User

Hola

¿Funciona más rápido?

•calculate(DISTINCTCOUNT('Detalles de la actividad'[ID de usuario de la solución]),datesbetween(calendar[date],max(calendar[date])-365,max(calendar[date])))


Regards,
Ashish Mathur
http://www.ashishmathur.com
https://www.linkedin.com/in/excelenthusiasts/

La versión totalmente ampliada de la fórmula que escribió es la siguiente

Active Users =
VAR latestDate =
    MAX ( 'Calendar'[Date] )
RETURN
    CALCULATE (
        DISTINCTCOUNT ( 'Activity Details'[Solution User ID] ),
        ALL ( 'Calendar'[Date] ),
        FILTER (
            ALL ( 'Activity Details'[Event Date] ),
            'Activity Details'[Event Date] <= latestDate
        ),
        FILTER (
            ALL ( 'Activity Details'[Event Date] ),
            'Activity Details'[Event Date] >= latestDate - 365
        )
    )

lo que necesita es esto

Active Users =
VAR latestDate =
    MAX ( 'Calendar'[Date] )
RETURN
    CALCULATE (
        DISTINCTCOUNT ( 'Activity Details'[Solution User ID] ),
        FILTER (
            ALL ( 'Calendar'[Date] ),
            'Calendar'[Date] <= latestDate
                && 'Calendar'[Date] >= latestDate - 365
        )
    )



* Matt is an 8 times Microsoft MVP (Power BI) and author of the Power BI Book Supercharge Power BI.

Hola @MattAllington Gracias por su respuesta. Me temo que no funcionó.

En primer lugar, la tabla 'Calendario' es solo una tabla de fechas y no está relacionada con ninguna otra tabla, ya que solo la estoy usando como un filtro "Hasta la fecha" en mis métricas. Todas las métricas sumar o contar desde el principio de tiempo o un período fijo (hoy - 365 días).

Incluso si elimino ALL ( 'Calendar'[Date] ) de mi fórmula original o ajusto la suya como se muestra a continuación, todavía ejecuta aproximadamente el mismo número de consultas de ejecución de almacenamiento que el número de fechas en el filtro.

Active Users =
VAR latestDate =
    MAX ( 'Calendar'[Date] )
RETURN
    CALCULATE (
        DISTINCTCOUNT ( 'Activity Details'[Solution User ID] ),
        FILTER (
            'Activity Details',
            'Activity Details'[Event Date] <= latestDate
                && 'Activity Details'[Event Date] >= latestDate - 365
        )
    )

Bueno, si no hay relación, entonces sí, no funcionará. En términos generales, no debe filtrar una tabla si puede filtrar una columna. Por lo tanto, el primer parámetro de filtro es mejor como ALL('Activity Details'[Event Date]). Pero mejor aún es tener una tabla de calendario con una relación.



* Matt is an 8 times Microsoft MVP (Power BI) and author of the Power BI Book Supercharge Power BI.

@MattAllington He subido una versión muy simplificada del modelo aquí. Por favor, sugiera qué cambios haría para que funcione. Básicamente, sólo tengo una tabla Date para usar en el filtrado y para usar como el Eje X en gráficos. El recuento de descuentos debe hacerse desde 365 días antes de la fecha en el Eje X.

Hola

Consulte la segunda pestaña de este archivo PBI.


Regards,
Ashish Mathur
http://www.ashishmathur.com
https://www.linkedin.com/in/excelenthusiasts/

Me temo que este DAX también llama a una consulta del motor de almacenamiento por fecha. Además, necesitamos filtrar por 'Fecha del evento' no Calendario[Fecha] ya que no hay ninguna relación.

La siguiente consulta solo llama al motor de almacenamiento una vez, pero tiene una larga espera en el motor de fórmulas.

Active Users = 
var latestDate = MAX('Calendar'[Date])
RETURN
CALCULATE(
    SUMX(
        SUMMARIZE(
            'Activity Details', 'Activity Details'[Group User ID],
            "Last Event", MAX('Activity Details'[Event Date])
        ),
        1
    ),
    ALL('Calendar'[Date]),
    'Activity Details'[Event Date] <= latestDate,
    'Activity Details'[Event Date] >= (latestDate - 365)
)

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.