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

Logre un recuento distinto con Slicer

Tengo una tabla de datos de estudiantes que muestra varios cambios en los registros de solicitud, incluso cuando se ha hecho una oferta. Las fechas están vinculadas a un número de día de año, y las filas se indexan para cada solicitante en función del campo de rango de solicitud.

StudentIdApplicationRankNúmero de díaOfrecerÚltimoRecord
Estudiante1200FALSO
Estudiante2350FALSO
Estudiante3470FALSO
Estudiante42001FALSO
Estudiante52201FALSO
Estudiante62201VERDADERO
Estudiante72391FALSO
EstudianteB12000FALSO
EstudianteB22011VERDADERO
EstudianteB33001FALSO
EstudianteB43011FALSO

El campo "LatestRecord" es una columna calculada de la siguiente manera, donde CurrentDayOfYearNumber devuelve el número de día basado en la fecha de hoy:

LatestRecord =

SI(
[ApplicationRank] <> BLANK()
&& 'StudentData'[ApplicationRank] =
MAXX(
FILTRO(
'StudentData',
[StudentId] = ANTERIOR( [StudentId])
&& 'StudentData'[DayNumber]<= [CurrentDayOfYearNumber]
),
'StudentData'[ApplicationRank]
),
TRUE(), FALSE()
)
Así que en la tabla el número de día está en 220, por lo tanto, el resultado es TRUE para StudentA ApplicationRank 6 y para StudentB ApplicationRank 2. Luego puedo usar este campo para identificar siempre la fila que se calculará en la medida que cuenta el número de ofertas, por lo que el día 220 las ofertas son iguales a 2 (usando un recuento distinto en StudentId y LatestRecord = TRUE).
Ahora quiero usar una segmentación de datos DayNumber para moverme dinámicamente a través de los días y mostrar el número de ofertas en cada punto, sin embargo, incluso con un recuento distinto, no puedo obtener un recuento de una fila individual sin el contexto de algo similar a LatestRecord, por lo que para el día 220 el recuento de ofertas termina siendo 4 (número de filas donde la oferta = 1 y el número del día es < = día 220 en la segmentación de datos).
Cualquier ayuda muy apreciada!
1 ACCEPTED SOLUTION
Syndicate_Admin
Administrator
Administrator

Hay @Craines

Le sugiero que cree una tabla DayNumber no relacionada por dax o parámetro what if para crear una segmentación de datos. Luego calcule el recuento distinto de la identificación del estudiante por medida.

Tabla DayNumber:

DayNumber = GENERATESERIES(1,MAX('Table'[DayNumber]))

Medir:

Distinct Count ID = 
VAR _SelectDayNumber =
    SELECTEDVALUE ( DayNumber[Value] )
RETURN
    CALCULATE (
        DISTINCTCOUNT ( 'Table'[StudentId] ),
        FILTER ( ALL ( 'Table' ), 'Table'[DayNumber] <= _SelectDayNumber )
    )

Saludos
Rico Zhou

Si esta publicación ayuda, considere Aceptarla como la solución para ayudar a los otros miembros a encontrarla más rápidamente.

View solution in original post

9 REPLIES 9
Syndicate_Admin
Administrator
Administrator

Hay @Craines

Le sugiero que cree una tabla DayNumber no relacionada por dax o parámetro what if para crear una segmentación de datos. Luego calcule el recuento distinto de la identificación del estudiante por medida.

Tabla DayNumber:

DayNumber = GENERATESERIES(1,MAX('Table'[DayNumber]))

Medir:

Distinct Count ID = 
VAR _SelectDayNumber =
    SELECTEDVALUE ( DayNumber[Value] )
RETURN
    CALCULATE (
        DISTINCTCOUNT ( 'Table'[StudentId] ),
        FILTER ( ALL ( 'Table' ), 'Table'[DayNumber] <= _SelectDayNumber )
    )

Saludos
Rico Zhou

Si esta publicación ayuda, considere Aceptarla como la solución para ayudar a los otros miembros a encontrarla más rápidamente.

Esto ha funcionado perfectamente para obtener el recuento utilizando un parámetro What If y la siguiente medida:

Contar =

VAR SelectedDay = SELECTEDVALUE(DateSelect[DateSelect])

DEVOLUCIÓN

CALCULAR(

DISTINCTCOUNT(

'Tabla'[StudentId]

),

'Tabla'[Oferta] = "1",

FILTRO(

ALLSELECTED(

'Tabla'

),

'Tabla'[Número de día] <= SelectedDay

&& 'Table'[ApplicationRank] <= MAX( 'Table'[ApplicationRank]

)

)

)

pero tengo una capa adicional de complejidad que no parece resolver: he agregado las columnas OfferType a continuación para explicar esto:

StudentId

ApplicationRank

Número de día

Ofrecer

OfertaTypeA

OfertaTipoB

ÚltimoRecord

Estudiante

1

20

0

0

0

FALSO

Estudiante

2

35

0

0

0

FALSO

Estudiante

3

47

0

0

0

FALSO

Estudiante

4

200

1

1

0

FALSO

Estudiante

5

220

1

1

0

FALSO

Estudiante

6

220

1

0

1

VERDADERO

Estudiante

7

239

1

0

1

FALSO

EstudianteB

1

200

0

0

0

FALSO

EstudianteB

2

201

1

1

0

VERDADERO

EstudianteB

3

300

1

1

0

FALSO

EstudianteB

4

301

1

0

1

FALSO

Así que necesitaría el conteo de la siguiente manera:

DayNumber 200 – Oferta = 1; OfferTypeA = 1

DayNumber = 201 – Oferta = 2; OfferTypeA = 2

DayNumber = 220 – Oferta = 2; OfferTypeA = 1; OfferTypeB = 1

Así que por día número 301 Oferta = 2; OfferTypeB = 2

El problema en este momento es que el recuento está incluyendo a todos aquellos que alguna vez han sido un OfferTypeA, incluso si luego cambian a OfferTypeB, por lo que DayNumber 301 Offer = 2; OfferTypeA = 2; OfferTypeB = 2

¿Hay alguna manera de arreglar esto dentro de mi medida?

Muchas gracias

Syndicate_Admin
Administrator
Administrator

Hola @crains
¿Ha intentado cambiar la condición para que se base en la segmentación de datos de fecha seleccionada?

Y agregar un filtro para todos los valores a la plantilla en función del valor de fecha máximo seleccionado

Parece que no puedo hacer una columna calculada dentro de la tabla que identifique el registro que se seleccionará en función del valor de la segmentación de datos, ¿es esto posible?

@Craines Hola

No se puede crear una columna calculada que cambie dinámicamente, pero se puede crear una medida que utilice la fórmula de valor seleccionada o, en este caso, recomendaría usar Max(valor de segmentación de datos de fecha)

He intentado crear una variable dentro de mi medida:

VAR Include = IF( SELECTEDVALUE( 'StudentData'[ApplicationRank]) = MAXX( FILTER( 'StudentData', 'StudentData'[SameStudentId] = TRUE() && 'StudentData'[DayNumber] <= CurrentDay), 'StudentData'[ApplicationRank]), TRUE())
donde el campo "SameStudentId" se rellena comprobando si el StudentId de la fila anterior es el mismo que el de la fila actual, pero esto no parece funcionar
Syndicate_Admin
Administrator
Administrator

Debería poder implementar esto con un parámetro "What-If" y ajustar su medida en consecuencia.

¿Qué sucede cuando este proceso se extiende más allá de un año? ¿O comienza antes del 1 de enero?

Hay pasos adicionales que aseguran que toda la actividad permanezca dentro de una ventana de un año, que es un año académico, por lo que se extiende a partir de octubre de cada año, por lo que esto no causaría un problema con la cortadora, debería funcionar en todos los años.

¿Puede explicar lo que quiere decir con "un parámetro "What-If" y ajustar su medida en consecuencia", por favor?

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.