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

Contar una medida

Actualizado con archivo de ejemplo: archivo de muestra

¡Hola, espero que alguien pueda ayudar!

Tengo los datos a continuación y el uso de la medida a continuación para mostrarme el ID de la más reciente "Solicitud" si había una "Respuesta" por número de cuenta. Nota: podría haber varios IDs por 1 número de cuenta, solo depende de si hubo una respuesta o no.

MeasureTM CALCULATE(MAX('Activity'[ID]),Filter('Activity', 'Activity'[Activity] ?"Request" && CALCULATE(MAX('Activity'[ID])<CALCULATE(MAX('Activity'[ID]),'Activity'[Activity]-"Response",ALLEXCEPT('Activity',' Activity'[Account]))))

CuentaActividadFecha de actividadUsuarioId
1Petición01/01/2021Tom1
1Petición01/02/2021Jim2
1Petición01/03/2021John3
1Respuesta01/04/2021Stephanie4
2Petición01/05/2021será5
2Respuesta01/06/2021Joe6
3Petición01/07/2021Anna7
3Petición01/08/2021Ámbar8
3Respuesta01/09/2021Katie9
4Petición01/10/2021Jack10
4Respuesta01/11/2021Bob11
4Petición01/12/2021John11
4Respuesta01/13/2021Tom12
5Petición01/14/2021Liam13

Así que las líneas resaltadas en amarillo es lo que mi meausre me está consiguiendo. Sin embargo, quiero ir un paso más allá y contar esa medida. Así que en este caso, sería 4. ¿Algún consejo?

Capture.PNG

Gracias de antemano!

1 ACCEPTED SOLUTION

Hey @PowerBI123456 ,

aquí encontrará un nuevo enfoque :-), tenga en cuenta que este enfoque hace referencia a las columnas de las tablas de dimensiones. Para ello también es necesario cambiar los objetos visuales. Significado: utilice columnas de las tablas de dimensiones en su lugar.
Esta medida tampoco es tan genérica, ya que devuelve el requestID máximo, por lo que devolverá los resultados esperados cada vez que se utilice el colum acoount.
Si utiliza la medida en un objeto visual de tarjeta, volverá a ejecutar 12 en lugar de 4. Si necesita el 4 recomiendo usar un SUMX o COUNTX en combinación con VALUES('...'[account]

MaxReq Star = 
var t = 
ADDCOLUMNS(
        VALUES( 'DIM: Accounts'[Account] )
        , "maxrequestid" 
            , var MaxResponseID =
                CALCULATE( 
                    MAX( 'FACT: Activity'[ID] )
                    , ALL('DIM: Date' )
                    , ALL( 'DIM: Users' )
                    , ALL( 'FACT: Activity'[ID] )             
                    , 'DIM: Activity'[Activity] = "Response"
                )
            var MaxRequestID = 
                CALCULATE( 
                    MAX( 'FACT: Activity'[ID] )
                    , ALL( 'DIM: Date' )
                    , ALL( 'DIM: Users' )
                    , 'DIM: Activity'[Activity] = "Request"
                    
                    --, 'FACT: Activity'[ID] = MaxResponseID - 1
                    , 'FACT: Activity'[ID] < MaxResponseID
                )
            return
            MaxRequestID
        )
return

CALCULATE(
    MAX( 'FACT: Activity'[ID] )
    , TREATAS( t , 'DIM: Accounts'[Account] , 'FACT: Activity'[ID] )
)

Aquí hay una captura de pantalla que muestra el uso de columna del visual del mapa de árbol:
image.png

Tenga en cuenta que el desafío general al que nos enfrentamos se basa en el hecho de que el almacén de datos (nuestro querido tabular SSAS dentro de Power BI) no conoce un tipo de datos de secuencia. A veces, aquí, esto hace las cosas difíciles, las otras veces es un plus.

Sin embargo, si esto no funciona, es posible que desee leer este artículo, aquí presento un enfoque diferente para abordar el desafío de valor anterior: El valor anterior - Mincing Data - Obtener información de datos (minceddata.info)

saludos

Tom

View solution in original post

29 REPLIES 29
Syndicate_Admin
Administrator
Administrator

No @PowerBI123456,

Estos son los pasos que puede seguir:

1. Ingrese la consulta de energía a través de los datos de transformación y seleccione agregar columna --- columna de índice --- de 1 para generar el índice

v-yangliu-msft_0-1613695188777.jpeg

2. Cree una columna calculada.

Flag =
var _1=
CALCULATE(MAX('Table'[Index]),FILTER(ALL('Table'),[Activity]="Request"&&[Account]=EARLIER('Table'[Account])))
var _2=
CALCULATE(MAX('Table'[Activity]),FILTER('Table',[Account]=EARLIER('Table'[Account])&&[Index]=EARLIER('Table'[Index])+1))
return
IF(
    _1=[Index]&&_2="Response",1,0)

3. Cree la medida.

count = SUMX(ALL('Table'),[Flag])

4. Resultado:

v-yangliu-msft_1-1613695188783.jpeg

Puede descargar el archivo PBIX desde aquí.

Saludos

Liu Yang

Si este post ayuda, entonces considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

Syndicate_Admin
Administrator
Administrator

Aquí hay una manera de hacerlo que devuelve 4 de la tabla de ejemplo.

Cuentas con respuesta y solicitud de prev ( Prev Request)
COUNTROWS (
FILTRO (
RESUMIR (
FILTRO (
Actividad
Actividad[Actividad] - "Respuesta"
),
Actividad[Cuenta],
"cMax", MAX ( Actividad[Fecha de actividad] )
),
VAR vcMax á [cMax]
devolución
NO (
ISBLANK (
CALCULAR (
COUNTROWS ( Actividad ),
Actividad [Fecha de actividad] < vcMax,
Actividad[Actividad] - "Solicitud"
)
)
)
)
)

palmadita

Syndicate_Admin
Administrator
Administrator

@TomMartens He subido el PBI en el siguiente enlace. La tabla de la izquierda es el aspecto de los datos y la tabla de la derecha es lo que la medida me muestra. Quiero hacer un recuento de eso por lo que sería 4 en este ejemplo.

Archivo de muestra

Hola @PowerBI123456 ,

la forma más sencilla de contar si una medida devuelve un valor, independientemente del resultado, es utilizar la función de iterador de tabla COUNTX ().
La siguiente medida recorre en iteración las cuentas y cuenta las "Cuentas" que devuelven un valor. Como VALUES() vuelve a una tabla (muchas filas, pero sólo una columna) con valores distintos, no está sucediendo ningún "doble conteo".

Measure = 
COUNTX(
    VALUES(
        'Activity'[Account]
    )
    , [Max Request ID]
)

Una pequeña captura de pantalla basada en el pbix que proporcionó:

TomMartens_0-1613623810417.png

Con suerte, esto es lo que estás buscando,

saludos

Tom


@TomMartens ¡Muchas gracias!

Así que otra cosa que estoy tratando de hacer es un mapa de árbol que muestra el recuento por el usuario que hizo la última solicitud, pero este recuento es incluyendo todos los usuarios que hicieron una solicitud en la cuenta. ¿Sabes cómo mostrar solo a los 4 usuarios? Archivo actualizado: Archivo de ejemplo

PowerBI123456_0-1613690715669.png

¡Muchas gracias por su ayuda!

Hey @PowerBI123456 , explicar lo que se debe contar en función de los datos de muestra en el pbix y el resultado esperado.

saludos

Tom

@TomMartens Hola - Estoy tratando de mostrar a los usuarios que ponen en la última solicitud. Basándose en los datos, sería:

  • Cuenta 1: John
  • Cuenta 2: Will
  • Cuenta 3: Amber
  • Cuenta 4: John

Quiero usar un mapa de árbol para mostrar que cada una de esas 4 personas tenía 1 solicitud. El problema es que mi mapa de árbol actual es contar todos los que hicieron una solicitud para cada cuenta, por lo que muestra más de lo que quiero. Espero que tenga sentido.

Hey @PowerBI123456 ,

esta medida

MaxReq = 
var t = 
    ADDCOLUMNS(
        FILTER(
            'Activity'
            , CALCULATE(
                CONTAINSROW(
                    VALUES( 'Activity'[Activity] ) 
                    , "Response" 
                ) 
                , ALLEXCEPT( 'Activity' , Activity[Account] )
            )
        )
        , "MaxRequestID"
            , var account = [Account] 
            var maxID =
                CALCULATE( 
                    MAX( Activity[ID] ) 
                    , ALL( 'Activity' )
                    , 'Activity'[Account] = account
                    , 'Activity'[Activity] = "Request"
                )
            return
            maxID
    )
return

SUMX(
    t 
    , IF(
        'Activity'[ID] = [MaxRequestID] && 'Activity'[Activity] = "Request"
        , 1 --[MaxRequestID]
        , BLANK()
    )
)

permite crear esta página de informe

image.png

Desde el punto de vista de visualización de datos, favoreo mucho más la barra apilada que el mapa árbol.

Si "justo" desea mostrar al usuario que está a cargo de la última solicitud, usaría una simple tabla Cuenta | | usuario la medida [MaxReQ]
No estoy seguro de si realmente entiendo las cosas de la fecha de su medida, tal vez usted tiene que comprobar mi medida con un conjunto de datos más grande.

Con suerte, esto es lo que estás buscando.

saludos
Tom


¡¡¡Muchas gracias!!! Esto funciona, pero lo único que está obteniendo el ID máximo de la solicitud general por cuenta, pero necesito el ID máximo de la solicitud justo antes de la respuesta. Actualicé el archivo de ejemplo para mostrar lo que quiero decir y disculpas por no agregarlo antes. Podría haber otra solicitud después de una respuesta que esta medida captaría. Necesito la solicitud justo antes de la respuesta. Agregué otra solicitud para la cuenta 4 después de la respuesta de Jack. Esta medida está captando esa petición cuando debería ser John. Espero que tenga sentido.

Archivo actualizado: Archivo de ejemplo

Hey @PowerBI123456 , para reformular este requisito un poco diffrently ...
Usted está buscando el MAX Request-ID que es más pequeño que el IDENTIFICADOR de respuesta más grande para la misma cuenta, correcto?
saludos
Tom

@TomMartens ¡Sí! ¡Lo siento, no lo aclaré mejor!

Hey @PowerBI123456 ,

no hay problema, a veces se necesita algún tiempo para encontrar una comprensión mutua. Uso "reformulación" no porque mi explicación sea mejor, es ayuda a reducir el requisito.
Sin embargo, aquí tienes:

MaxReq = 
var t = 
    ADDCOLUMNS(
        ADDCOLUMNS(
            FILTER(
                'Activity'
                , CALCULATE(
                    CONTAINSROW(
                        VALUES( 'Activity'[Activity] ) 
                        , "Response" 
                    ) 
                    , ALLEXCEPT( 'Activity' , Activity[Account] )
                )
            )
            , "MaxResponseID"
                , var account = [Account] 
                var maxID =
                CALCULATE( 
                    MAX( Activity[ID] ) 
                    , ALL( 'Activity' )
                    , 'Activity'[Account] = account
                    , 'Activity'[Activity] = "Response"
                )
            return
            maxID
        )
        , "MaxRequestID"
            , var account = [Account]
            var maxResponseID = [MaxResponseID] 
            var maxID =
                CALCULATE( 
                    MAX( Activity[ID] ) 
                    , ALL( 'Activity' )
                    , 'Activity'[Account] = account
                    , 'Activity'[Activity] = "Request"
                    , 'Activity'[ID] < maxResponseID
                )
            return
            maxID
    )
return

SUMX(
    t 
    , IF(
        'Activity'[ID] = [MaxRequestID] && 'Activity'[Activity] = "Request"
        , 1 --[MaxRequestID]
        , BLANK()
    )
)

Agregué un MaxResponseID en la tabla virtual, que luego se usará para encontrar el MaxRequestID que es más pequeño que el MaxResponseID.
Con suerte, esto es lo que estás buscando.

saludos
Tom

@TomMartens Desafortunadamente se cronometró diciendo que no tengo suficiente memoria. Probablemente sea porque estoy lidiando con 20 millones de filas.

Hey @PowerBI123456 ,

Siento oír eso.
La medida "final", no parece tan diferente pero hay una sutileza, está en determinig el MaxRequestID, ya que ahora tiene que encontrar los identificadores adecuados primero (menos que el MaxResponseID) antes de que se pueda determinar el MaxRequestID.
Esto conduce a la materialización de "consultas" ya que un simple escaneo booleano ya no es suficiente.
Además de que sólo tiene una solución de mesa "temida", esto es responsable de esta parte de la medida

...
FILTER(
                'Activity'
                , CALCULATE(
                    CONTAINSROW(
                        VALUES( 'Activity'[Activity] ) 
                        , "Response" 
                    ) 
                    , ALLEXCEPT( 'Activity' , Activity[Account] )
                )
            )
...

lo anterior determina mejor las Cuentas que no tienen responsabilidades. Este y algunos otros componentes se pueden simplificar mediante un esquema de estrella adecuado.
Recomiendo leer este artículo (Diseñar un modelo de datos en Power BI - Aprender | Microsoft Docs).
Por supuesto, la medida se puede optimizar, pero esto puede llegar a ser muy lento y una comprensión exhaustiva de sus datos y su modelo de datos es necesario.
Sin tener acceso al pbix, es decir, sus datos, esto será imposible. Tenga en cuenta que personalmente no voy a trabajar con archivos pbix que se comparten conmigo a través de enlaces privados, o mensajes privados.
Me temo que esto excederá el tiempo que la mayoría de nosotros somos capaces /dispuestos a pasar, al menos el mío.

saludos

Tom

@TomMartens ¡Gracias, y lo entiendo totalmente! Gracias por enviar también ese artículo. Voy a intentar esto una vez más ya que creo que mi modelo está en un esquema estelar. Desafortunadamente, no puedo subir el modelo real desde su confidencial. Pero he actualizado el archivo de ejemplo para incluir las tablas de dimensiones que tengo en mi modelo. Esto es obviamente mucho más simple ya que mis tablas de dimensiones tienen más columnas y mi tabla de hechos tiene millones de filas, pero todavía debería funcionar. Esperemos que estas tablas de dimensiones puedan ayudar a mejorar la medida que creó si no le importa mirar una vez más. ¡Realmente aprecio toda tu ayuda en esto!

ARCHIVO DE EJEMPLO

PowerBI123456_0-1614178070838.png

Hey @PowerBI123456 ,

esto parece un esquema estelar perfecto 🙂
Tal vez quieras subir otro pbix y corregir el error tipográfico en la tabla de actividades
Reponse --> Response

Nunca es una buena idea simplificar su solicitud proporcionando datos de ejemplo que no reflejan su modelo de datos.

Pasé algunas horas para llegar a la medida "final", en vano.
Tonto yo, que no pregunté si este es realmente su modelo de datos, pero me intrigaron las complejidades de su pregunta y me dejarse llevar 🙂
Sin embargo, cada vez que nos encontremos en la vida real me debes una cerveza 😉

saludos

Tom

@TomMartens Gracias, y archivo actualizado. ¿Eso significa que intentarás ayudarme una vez más 🙂

Archivo de ejemplo

Disculpas y lección aprendida, me aseguraré de subir todo mi modelo. Definitivamente le debe más de 1 cerveza!

Sí, lo haré, pero, desafortunadamente, lo veré el próximo fin de semana, ya que mi mente se distraía por algunos desafíos relacionados con el trabajo.

saludos
Tom

@TomMartens No hay problema. ¡Gracias, gracias, gracias!

Hey @PowerBI123456 ,

una pregunta a la naturaleza de la identificación en su tabla de hechos.
¿Es este ID un índice que crea una secuencia que crece en 1 sin huecos en la tabla de hechos
Si es así, ¿es esto cierto: dentro de un grupo de eventos (definido por una cuenta) el índice de una respuesta menos 1 siempre apunta a un evento de solicitud de tipo?

¿O puede ser posible que el predecesor inmediato de una respuesta sea otra respuesta.?

saludos
Tom

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.