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

filtrar tabla a la fila MAX de la cuenta

En "VAR __Table4" estoy filtrando la tabla 3. Sin embargo, necesito agregar un filtro más en el que estoy un poco perdido. Para cada cuenta solo quiero mirar la fila del ROWRANK "max" (con un círculo en azul a la derecha). Para el siguiente ejemplo, solo me gustaría ver la fila con el rowrank de 10. ¿Cómo puedo editar la tabla4 o qué paso puedo agregar para que busque y filtre para que solo muestre el rango de fila máximo de cada cuenta?

maxrow.PNG

Total Actives6 = 
VAR vMAXDATE = MAX('Date Table'[Date])

VAR __Table0 = 
    CALCULATETABLE(
        'MASTER CHARGE ACTIONS',
        ALLEXCEPT('MASTER CHARGE ACTIONS','MASTER CHARGE ACTIONS'[BI_ACCT]),'MASTER CHARGE ACTIONS'[CHG_DATE] <= vMAXDATE
    )

VAR __Table1 = 
    CALCULATETABLE(
        __Table0,
        'MASTER CHARGE ACTIONS'[CHG_DATE]<=vMAXDATE
    )

VAR __Table2 =
    SUMMARIZE(__Table1,'MASTER CHARGE ACTIONS'[BI_ACCT],"CHG_DATE",max('MASTER CHARGE ACTIONS'[CHG_DATE]))

VAR __Table3 =
    NATURALINNERJOIN(__Table1,__Table2)

VAR __Table4 = filter(__Table3,'MASTER CHARGE ACTIONS'[Account Status]="Active" && 'MASTER CHARGE ACTIONS'[CHG_DATE] <= vMAXDATE) 

VAR __Table5 =
    DISTINCT( 
        SELECTCOLUMNS(__Table4,"Account",'MASTER CHARGE ACTIONS'[BI_ACCT])
    )

RETURN
    CALCULATE(
        COUNTX(
            __Table5,[Account]
        )
    )

Cualquier ayuda es apreciada y por favor hágamelo saber si se necesita algo de información adicional.

¡Gracias!

1 ACCEPTED SOLUTION

Creo que esto funciona

Total Actives6 = 
VAR vMAXDATE = MAX('Date Table'[Date])
VAR __Table0 = 
    CALCULATETABLE(
        GENERATE( 
            VALUES( 'MASTER CHARGE ACTIONS'[BI_ACCT]),
            SELECTCOLUMNS(
                TOPN(1, FILTER( 'MASTER CHARGE ACTIONS', 'MASTER CHARGE ACTIONS'[CHG_DATE]<=vMAXDATE),
                    'MASTER CHARGE ACTIONS'[ROWRANK]
                ),
                "CHG_DATE", 'MASTER CHARGE ACTIONS'[CHG_DATE],
                "Account Status", 'MASTER CHARGE ACTIONS'[Account Status]
            )
        ),
        ALLEXCEPT('MASTER CHARGE ACTIONS','MASTER CHARGE ACTIONS'[BI_ACCT])
    )

var result = COUNTROWS( FILTER( __Table0, [Account Status] = "Active" ) )
return result

Se filtra el TOPN solo para filas antes de la fecha máxima, luego se aplica el filtro al estado de la cuenta por separado.

View solution in original post

8 REPLIES 8
Syndicate_Admin
Administrator
Administrator

Creo que puedes combinar GENERATE con TOPN para obtener solo la fila superior para cada cuenta. Necesitaría envolver el TOPN en un SELECTCOLUMNS para obtener todas las columnas excluyendo el número de cuenta, de lo contrario obtendría un error con 2 columnas que tienen el mismo nombre, pero algo así como

var _FilteredTable = GENERATE( VALUES(_Table4[BI_ACCT]),
SELECTCOLUMNS( TOPN(1, _Table4, _Table4[ROWRANK]),
"Column1", _Table4[Column1], ....
)

podría funcionar

@johnt75 gracias por la respuesta. Espero que sea solo sintaxis, pero no puedo ejecutar la variable que me has dado y que he intentado completar. La primera línea dice que el generador no es del tipo correcto y luego dice que no puede encontrar rowrank. No estoy seguro de cómo hacer referencia a una tabla de variables si eso es lo que se necesita. Puse un enlace al archivo si ayudaría a trabajar con esta medida. Gracias de nuevo.

Enlace al archivo y la imagen de los errores.

VALUES ERRORS.PNG
https://www.dropbox.com/s/hp52obgkpevffs0/OZARKSGO%202.0.pbix?dl=0

@johnt75 si fuera necesario hacer el cálculo antes en la medida, estaría bien. Supongo que tendría que hacer referencia a la tabla real. La única parte que tendría que venir después es la Tabla 1, donde la tabla se filtra a fechas en o antes de vMaxDate.

Si he entendido correctamente lo que estás tratando de hacer en el código, entonces creo que esto funciona

Total Actives6 = 
VAR vMAXDATE = MAX('Date Table'[Date])
VAR __Table0 = 
    CALCULATETABLE(
        GENERATE( 
            VALUES( 'MASTER CHARGE ACTIONS'[BI_ACCT]),
            SELECTCOLUMNS(
                TOPN(1, 'MASTER CHARGE ACTIONS', 'MASTER CHARGE ACTIONS'[ROWRANK]),
                "CHG_DATE", 'MASTER CHARGE ACTIONS'[CHG_DATE],
                "Account Status", 'MASTER CHARGE ACTIONS'[Account Status]
            )
        ),
        ALLEXCEPT('MASTER CHARGE ACTIONS','MASTER CHARGE ACTIONS'[BI_ACCT]),
        'MASTER CHARGE ACTIONS'[CHG_DATE]<=vMAXDATE,
        'MASTER CHARGE ACTIONS'[Account Status] = "Active"
    )
var result = COUNTROWS( __Table0 )
return result

@johnt75 por lo que el objetivo final es contar las cuentas "activas" en comparación con el filtro de fecha. La razón por la que quería obtener el ROWRANK "máximo" era centrarme en la última fila. En el siguiente ejemplo tengo la fecha como 18/12/2018. La 'Max Acct Date' muestra correctamente qué cuentas deberíamos estar mirando. Técnicamente hay una fila activa que es menor que la fecha del filtro, pero no es la última fila. En el siguiente ejemplo (renombré la medida a "totalActive7") se marca como activa, pero el ROWRANK 10 está realmente inactivo. Realmente he luchado para que ese último poco de lógica funcione. La esperanza es que las fechas que son menores que el filtro de fecha solo miren el rango de fila máximo. Si pudieras resolver esa pieza, estaría increíblemente agradecido.

GunnerJ_0-1653490048586.png

Creo que esto funciona

Total Actives6 = 
VAR vMAXDATE = MAX('Date Table'[Date])
VAR __Table0 = 
    CALCULATETABLE(
        GENERATE( 
            VALUES( 'MASTER CHARGE ACTIONS'[BI_ACCT]),
            SELECTCOLUMNS(
                TOPN(1, FILTER( 'MASTER CHARGE ACTIONS', 'MASTER CHARGE ACTIONS'[CHG_DATE]<=vMAXDATE),
                    'MASTER CHARGE ACTIONS'[ROWRANK]
                ),
                "CHG_DATE", 'MASTER CHARGE ACTIONS'[CHG_DATE],
                "Account Status", 'MASTER CHARGE ACTIONS'[Account Status]
            )
        ),
        ALLEXCEPT('MASTER CHARGE ACTIONS','MASTER CHARGE ACTIONS'[BI_ACCT])
    )

var result = COUNTROWS( FILTER( __Table0, [Account Status] = "Active" ) )
return result

Se filtra el TOPN solo para filas antes de la fecha máxima, luego se aplica el filtro al estado de la cuenta por separado.

@johnt75 muchas gracias! Mis pruebas muestran que funciona para mostrar si una cuenta está activa en una fecha determinada.

Si puedo pedir un seguimiento. Cuando lanzo esa medida en una tarjeta, da un total que no espero. Cuando arrojo la medida en una tabla al lado de las cuentas y filtro a es '1', entonces el número parece ser exactamente lo que quiero. No puedo actualizar el filtro de la tarjeta. ¿Sabes por qué la tarjeta podría mostrar un valor diferente?

actives filter.PNGactives7.PNG

sin contexto de filtro en el número de cuenta, el visual de la tarjeta incluye filas en blanco en la tabla generada y también las cuenta. No he podido descubrir cómo detener eso.

una solución alternativa podría ser tener una medida diferente para el total, que hace un ADDCOLUMNS .. RESUMIR para obtener los valores individuales y resumirlos.

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.