Declaración FILTER para devolver el registro más reciente para cada ID de usuario – a la fecha

Un usuario Pregunto ✅

waeltken

A la comunidad de PBI,

Estoy atascado con lo que parece que debería ser una operación simple de lugar común en expresiones DAX. Tengo una tabla de registros de empleados con fecha efectiva que relatan el historial de cada empleado en nuestro sistema de recursos humanos. Estoy tratando de construir una expresión de FILTRO para incluir una serie de medidas basadas en CALCULAR para calcular métricas de personas (por ejemplo, plantilla activa) para diferentes fechas de fecha. Básicamente, la medida de trabajo me permitirá calcular todos los empleados activos o subconjuntos de los mismos para cualquier fecha de vigencia actual o pasada solicitada: al final del primer trimestre, al final del año fiscal, etc. porque la tabla incluye todos los registros históricos de todos los empleados.

Si bien he podido escribir una declaración que excluye los registros con fecha futura con respecto a la fecha de vigencia (a partir de la fecha), estoy luchando por escribir otra expresión que filtraría la tabla de registros hasta el último registro en el archivo por ID DE USUARIO. Mi expresión actual pasa todos los registros que están en o antes de la fecha a mi función CALCULAR y cuando filtro los registros «Terminados», mi medida de recuento activo todavía muestra a algunas personas como activas erróneamente debido a ese factor.

Consulte mi tabla de medidas y datos a continuación. Tenga en cuenta que en el ejemplo mencionado anteriormente, a partir del 4/10/2021 mi medida debería calcular 2 empleados activos (ya que el empleado Junique habría pasado al estado de despedido antes de esa fecha). He sombreado en ROJO, qué registros deben pasarse a CALCULAR desde FILTRO para la fecha de vigencia / fecha de fecha de 4/10/2021)

waeltken_0-1620235824615.png

Aquí está mi medida y la salida de PBI Desktop:

2021-05-05_13-32-20.png

Agradezco su tiempo para ayudarme a orientarme en la dirección correcta.

Muchas gracias,

Henrik

DataInsights

En respuesta a waeltken

@waeltken,

Reemplace la línea 21 en su ejemplo con el siguiente código:

CALCULATE (
   COUNTROWS ( FILTER ( vResult, 'Sample'[Employee Status] = "Active" ) )
)

La función FILTRO itera la tabla virtual vResult, filtrando el estado de empleado especificado.

waeltken

@DataInsights

Quería hacer un seguimiento y cerrar el ciclo aquí: tuve algunos problemas para adaptar la medida que proporcionó a mi escenario de fecha de producción en el que en realidad iba a extraer los datos de una tabla de calendario en lugar de una cortadora, pero ahora tengo con suerte lo descubrí de otra manera. Así es como resolví el problema:

waeltken_1-1620826896190.png

Esta versión filtra para Estado = Activo, Clase de empleado = Regular y División <> Global, que había estado filtrando a través de relaciones de tabla desde la tabla de búsqueda anteriormente, pero estaba reduciendo la tabla SF_All_Records antes de las funciones Max podrían destilar los últimos registros y valores de campo de dimensión relacionados.

¿Hay alguna forma de «desactivar» el contexto del filtro de relación de la tabla? para el argumento CALCULATETABLE parte del SUMX, pero luego aplique los filtros seleccionados para la clase y división del empleado, etc. segundo argumento en el iterador SUMX, una vez que la tabla As-of Date se ha destilado con éxito? De esa manera, podría eliminar los filtros codificados adicionales para esas dimensiones y colocarlos en los filtros visuales según sea necesario.

También yo

Saludos,

Henrik

DataInsights

En respuesta a waeltken

@waeltken,

He estado reflexionando sobre cómo lograrlo y encontré un artículo que puede ser útil. El concepto es utilizar una tabla de fechas separada que no esté sujeta al filtrado de la segmentación. Captura PeriodLastDate del contexto de filtro de la fila de la matriz y evalúa todas las filas donde Event Date <= PeriodLastDate (busque la fila con la última fecha para cada usuario y, si el estado es Activo, devuelva 1).

https://www.sqlbi.com/articles/show-previous-6-months-of-data-from-single-slicer-selection/

Extracto:

Cabe recordar que la selección de los valores a mostrar en el eje es independiente de la medida. Si una segmentación está filtrando un mes, no hay forma de mostrar meses adicionales de la misma tabla en las filas o columnas (o en el eje X, como en el ejemplo). Por lo tanto, debemos crear una tabla separada que no esté sujeta al filtrado de la segmentación. De esta forma, las columnas de esa tabla muestran todas las filas y podemos controlar su visibilidad a través de una medida.

DataInsights

@waeltken,

Prueba esta solución. Existe una relación entre la tabla de fechas y la tabla de muestra. El selector de fechas es de tipo Antes (hasta la fecha especificada incluida).

La medida:

ActiveHeadCount = 
VAR vAsOfDate =
    MAX ( asofdatetable[Date] )
VAR vResult =
    SUMX (
        VALUES ( 'Sample'[User Id] ),
        VAR vUser="Sample"[User Id]
        VAR vMaxDate =
            CALCULATE ( MAX ( 'Sample'[Event Date] ), 'Sample'[User Id] = vUser )
        VAR vStatus =
            CALCULATE (
                MAX ( 'Sample'[Employee Status] ),
                'Sample'[User Id] = vUser,
                'Sample'[Event Date] = vMaxDate
            )
        RETURN
            IF ( vStatus = "Active", 1 )
    )
RETURN
    vResult

DataInsights_0-1620308908535.png

DataInsights_1-1620308921029.png

Iterando VALORES (‘Muestra'[User Id] ) le da la opción de mostrar la identificación de usuario en el visual (funciona en cualquier caso). Además, VALUES (‘Muestra'[User Id] ) filtra las filas en las que la fecha del evento es mayor que la fecha seleccionada.

DataInsights

En respuesta a DataInsights

Versión simplificada:

ActiveHeadCount = 
SUMX (
    VALUES ( 'Sample'[User Id] ),
    VAR vUser="Sample"[User Id]
    VAR vMaxDate =
        CALCULATE ( MAX ( 'Sample'[Event Date] ), 'Sample'[User Id] = vUser )
    VAR vStatus =
        CALCULATE (
            MAX ( 'Sample'[Employee Status] ),
            'Sample'[User Id] = vUser,
            'Sample'[Event Date] = vMaxDate
        )
    RETURN
        IF ( vStatus = "Active", 1 )
)

waeltken

En respuesta a DataInsights

Muchas gracias por la función FILTRO, estaba encantado de probarla en Dax Studio y luego construir una tabla calculada en PowerBI. La tabla calculada no parece recalcarse en función del parámetro de fecha de vigencia, excepto si declaro un valor fijo. Intenté conectarlo a mi [PeriodLastDate] medir en mi tabla de Calendario y ejecutar una tabla con muchos finales de trimestres y fechas de finalización, pero los resultados sugieren que la tabla no recalc en el contexto de filtro diferente. Leí algunos artículos relacionados con tablas calculadas y la actualización generalmente se activa cuando el modelo vuelve a calcular o las tablas de origen se actualizan. No vi ninguna mención sobre cómo hacer que las tablas se actualicen dinámicamente desde dentro de los contextos de filtro.

También intenté pasar la Tabla filtrada de fecha efectiva a CALCULATE (Countrows ()) en el contexto de diferentes vEffDateParameter / PeriodLastDay, pero los resultados aún no tienen sentido. Seguire intentando.

Al menos ahora puedo recrear el estado de los datos por usuario para cada fecha de vigencia, de modo que puedo crear fácilmente una tabla de lecturas de respaldo con fechas limitadas / instantáneas.

Gracias,

Henrik

DataInsights

En respuesta a waeltken

@waeltken,

Eso es correcto: las tablas calculadas y las columnas calculadas no heredan el contexto del filtro. La medida [Effective Date Parameter] imita una segmentación / filtro, pero tiene que «codificar» la fecha en la medida. Si desea que la función FILTRO herede el contexto del filtro, deberá colocar la función FILTRO en una tabla virtual en una medida.

waeltken

En respuesta a DataInsights

DataInsights,

He estado usando esta construcción ahora para intentar construir mi modelo durante algunas semanas y funciona bien con un alcance limitado. Estoy tratando de averiguar si no hay otra forma de crear un filtro dinámico en toda mi tabla de datos de origen que primero elimina los registros efectivos con fecha futura y luego filtra el registro con fecha máxima disponible por ID, devolviendo una fecha efectiva deduplicada tabla que luego puedo usar en un CALCULATE (COUNTROWS (EffectiveDatedMaxRecordperID, con todos mis indicadores de estado requeridos en las declaraciones de filtro? Con la medida actual, tengo que declarar y calcular por separado como un VAR cualquier estado de campo de categoría / dimensión en la fecha máxima. En la medida actual, tampoco puedo filtrar usando relaciones de tabla activas, ya que filtran los datos de origen. Estaba pensando en jugar creando relaciones inactivas y luego «activarlas» más adelante en la evaluación de la expresión. Por ejemplo:
1) ¿sería posible calcular una tabla virtual que filtre mi tabla de registros maestros por las columnas combinadas de [User ID] Y [MaxDate] donde All Rercords[Event Date] <= Fecha de vigencia solicitada (parámetro de Fecha La medida]

Saludos,

Henrik

waeltken

En respuesta a waeltken

DataInsights,

He estado experimentando cómo pasar la tabla vResult a CALCULATE o funciones de iterador como COUNTAX para introducir filtros de categoría como, por ejemplo, Employee Status = «Active», pero cuando lo intenté, por ejemplo

CALCULAR (COUNTROWS (vResult), SampleData[Employee Status] = «Activo»)
Obtengo la misma medida que obtengo sin el filtro expressiom (CALCULATE (COUNTROWS (vResult)). Por supuesto que no puedo poner vResult[Employee Status] ya que está dentro de la medida, pero no hay una manera de decirle a DAX que filtre la tabla entregada por vResult. Esa tabla tiene todas las columnas incluidas originalmente en ‘Datos de muestra’ según DAX Studio.
waeltken_0-1623262730730.png

Sin embargo, en el conjunto de datos de muestra, a partir del 26/03/2021, uno de los tres empleados es Estado de empleado = Terminado. Parece que el filtro del estado de los empleados no está filtrando la tabla de vResult o está filtrando los datos de origen antes de Se calcula la salida de la tabla deduplicada fechada efectiva de vResult, lo que es esencial dejar solo las filas de origen donde cualquier empleado es Estado de empleado = «Activo» y luego Max data y deduplica desde allí.

¿Hay alguna forma de convencer a DAX para que trabaje más en la tabla heredada dentro de la medida? Agradezco cualquier consejo adicional que tenga para mí.

Saludos,

Henrik

DataInsights

En respuesta a waeltken

@waeltken,

Reemplace la línea 21 en su ejemplo con el siguiente código:

CALCULATE (
   COUNTROWS ( FILTER ( vResult, 'Sample'[Employee Status] = "Active" ) )
)

La función FILTRO itera la tabla virtual vResult, filtrando el estado de empleado especificado.

DataInsights

En respuesta a waeltken

@waeltken,

Puede crear una tabla calculada que devuelva la fila con la última fecha de vigencia del parámetro de medida de fecha.

La medida:

Effective Date Parameter = DATE ( 2021, 3, 25)

Tabla calculada:

MaxEffectiveDate = 
VAR vEffDateParameter = [Effective Date Parameter]
VAR vResult =
    FILTER (
        'Sample',
        VAR vUser="Sample"[User Id]
        VAR vMaxDate =
            CALCULATE (
                MAX ( 'Sample'[Event Date] ),
                ALL ( 'Sample' ),
                'Sample'[User Id] = vUser,
                'Sample'[Event Date] <= vEffDateParameter
            )
        RETURN
            'Sample'[User Id] = vUser
                && 'Sample'[Event Date] = vMaxDate
    )
RETURN
    vResult

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *