Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Administrator
2 years ago

Modelado de datos

Hola

Estoy creando una descripción general de FTE (equivalente a tiempo completo), pero la fecha es la siguiente:
1- Fecha de finalización del 31/12/9999 significa el día actual + si el estado es activo, entonces todavía activo (en servicio).

2- Si un empleado no está activo en el día de hoy, quiero que se elimine o que solo se cuente hasta la última fecha de finalización. por ejemplo, la segunda entrada (Empleado A) debe eliminarse/no contarse y el estado de la primera entrada debe cambiarse a Inactivo

3- El ID de algunos empleados tiene múltiples entradas (duplicadas; en algunos casos más de dos veces) en la fecha de inicio, debido a la rotación de trabajos, cambio de departamentos, etc. pero quiero ajustar la fecha de inicio, para que la primera fecha de inicio (la más temprana) siga siendo la misma, pero la siguiente sería la fecha de finalización de la anterior y así sucesivamente. Por lo tanto, la fecha de inicio en el nuevo departamento debe ser la fecha de finalización del departamento anterior.

4- Algunos empleados (en Muestra-Empleado C) tienen el mismo departamento, pero diferente número de empleado. Eso significa que pasaron de un contrato externo o como pasante a un contrato de empresa. Me gustaría mantener a los pasantes fuera de los cálculos

Emp.NoNombre de EmpFecha de inicioFecha finalEstado
9503Empleado A23/05/197228/03/2021Activo
9503Empleado A23/05/197231/12/9999Inactivo
257Empleado B24/03/198631/07/2021Activo
257Empleado B24/03/198631/12/2021Activo
257Empleado B24/03/198631/12/9999Inactivo
919Empleado C01/03/202330/10/2023Activo
919Empleado C01/03/202331/12/9999Inactivo
2721Empleado C29/08/202228/02/2023Activo
2721Empleado C29/08/202231/12/9999Inactivo
2778Empleado C01/02/202431/12/9999Activo

2 Replies

  • @O-K

    Para abordar los requisitos que ha descrito, deberá realizar varios pasos con Power Query en Power BI para transformar y limpiar los datos. Aquí tienes una guía paso a paso sobre cómo cumplir con cada uno de tus requisitos:

    1. **Manejar las fechas de finalización actuales**:
    - Reemplace las fechas de finalización de "31/12/9999" con la fecha actual para representar el día actual.
    - Identificar y marcar a los empleados con el estado "Activo" más allá de la actualidad.

    2. **Filtrar empleados inactivos**:
    - Filtra las filas en las que la fecha de finalización es anterior al día actual.
    - Actualice el estado del último registro de cada empleado a "Inactivo" si se extiende más allá del día actual.

    3. **Ajustar las fechas de inicio de las rotaciones de trabajo**:
    - Ordena los datos por número de empleado y fecha de inicio en orden ascendente.
    - Utilice la función Table.Group para agrupar los datos por número de empleado.
    - Cree una función personalizada para iterar sobre las filas dentro de cada grupo para ajustar las fechas de inicio en función de las fechas de finalización de las filas anteriores.
    - Aplique la función personalizada a cada grupo para ajustar las fechas de inicio en consecuencia.

    4. **Filtrar a los pasantes**:
    - Identifique y filtre las filas en las que el número de empleado aparece varias veces pero con diferentes estados.
    - Mantenga solo las filas en las que el estado no sea "Pasante".

    Este es un resumen de las transformaciones de Power Query que deberá realizar:

    - Reemplace los valores en la columna "Fecha de finalización" para representar el día actual.
    - Filtra a los empleados inactivos.
    - Ajustar las fechas de inicio de las rotaciones de trabajo.
    - Filtra a los pasantes.
    - Opcionalmente, realice una limpieza y formateo adicionales según sea necesario.

    Estas transformaciones se pueden lograr mediante el Editor de Power Query en Power BI. Si necesita orientación más específica sobre cualquiera de estos pasos, ¡no dude en preguntar!


    ¿He respondido a tu pregunta? ¡Marca mi publicación como una solución! ¡¡Agradezco sus felicitaciones!!

  • Hola

    Gracias por la solución @johnbasha33 proporcionada, y quiero ofrecer información para que el usuario la consulte.

    hola @O-K, puede crear una consulta en blanco y poner el siguiente código en el editor avanzado.

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("nZE7CgIxEECvIqkX5pNdkymjWHiGZQuRFIK/QgRv72Q1uErU1XSveLzJTNsaadCayix2x+3hEuMkKLAFbIDEcQIPaIGRSSGsT5tzNF01QrQExCD6FJb71UPlxg3NWTLrVCHx05uJrpAc4WnxX680qZAMzbkC0n0f6fcWgTBD+MF7vxvXT/+ksgD6pOZ7cCH5VfzUdL40bp+pX9Xc7K4=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Emp.No = _t, #"Emp Name" = _t, #"Start date" = _t, #"End Date" = _t, Status = _t]),
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Emp.No", Int64.Type}, {"Emp Name", type text}, {"Start date", type text}, {"End Date", type text}, {"Status", type text}}),
        #"Changed Type with Locale" = Table.TransformColumnTypes(#"Changed Type", {{"Start date", type date}, {"End Date", type date}}, "en-GB"),
        #"Filtered Rows" = Table.SelectRows(#"Changed Type with Locale", each ([Emp.No]=List.Max(Table.SelectRows(#"Changed Type with Locale",(x)=>x[Emp Name]=[Emp Name])[Emp.No]))),
        #"Grouped Rows" = Table.Group(#"Filtered Rows", {"Emp.No"}, {{"Count", each Table.AddIndexColumn(_,"Index",1,1), type table }}),
        #"Expanded Count" = Table.ExpandTableColumn(#"Grouped Rows", "Count", {"Emp Name", "Start date", "End Date", "Status", "Index"}, {"Emp Name", "Start date", "End Date", "Status", "Index"}),
        #"Added Custom" = Table.AddColumn(#"Expanded Count", "Custom", each let a=Table.SelectRows(#"Expanded Count",(x)=>x[Emp Name]=[Emp Name] and x[Status]="Inactive")[End Date]{0},
    b=List.Max(Table.SelectRows(#"Expanded Count",(x)=>x[Emp Name]=[Emp Name] and x[End Date]<a)[End Date])
    in if [Index]=1 then [Status] else if [Status]="Active" and [End Date]=b then "Inactive" else null),
        #"Filtered Rows1" = Table.SelectRows(#"Added Custom", each ([Custom] <> null)),
        #"Replaced Value" = Table.ReplaceValue(#"Filtered Rows1",each [Start date],each if [Index]=1 then [Start date] else Table.SelectRows(#"Filtered Rows1",(x)=>x[Emp Name]=[Emp Name] and x[Index]=[Index]-1)[End Date]{0},Replacer.ReplaceValue,{"Start date"}),
        #"Removed Columns1" = Table.RemoveColumns(#"Replaced Value",{"Status", "Index"})
    in
        #"Removed Columns1"

    Salida

    ¡Saludos!

    Yolo Zhu

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