Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Earn the coveted Fabric Analytics Engineer certification. 100% off your exam for a limited time only!

Reply
elietech
Helper II
Helper II

Transforme y resuma los datos de una tabla en otra...

Ok, este es el problema al que me enfrento.

Tengo un conjunto de datos que registra cada vez que se quita un equipo del servicio por ser inservible, y registra el tiempo que fue "DOWN" (eliminado) y el momento en que volvió "UP" (regresó al servicio).

Lo que quiero ser capaz de hacer es determinar en base a estas tarifas de utilidad general de datos para todo el equipo en un período de tiempo determinado, y no puedo encontrar mi cabeza alrededor del problema para obtener lo que necesito.

Conozco el total de equipos disponibles, pero puede que no sea consistente en un día determinado. (Nuevo equipo añadido, o equipo antiguo retirado/obsoleto, etc.)

Los registros Up/Down se ven así esencialmente:

EQUIP_ID, EVENT_ID, DOWN_START (campo Fecha/Hora), DOWN_STOP (campo Fecha/Hora), DOWN_DURATION (minutos)

La DOWN_DURATION a veces puede abarcar varios días. Además, se espera que el quipment sea UP más de lo que it's DOWN, y ciertamente no está abajo todos los días.

Básicamente, lo que quiero hacer es usar estos datos para crear una tabla como esta:

FECHA, EQUIP_ID, SERVICEABLE_TIME

donde DATE es una fecha de calendario determinada que cubre cada fecha en un intervalo de fechas que podría filtrarse con una cortadora, EQUIP_ID es el ID único de la pieza del equipo, y SERVICEABLE_TIME es el número de minutos que el equipo estuvo disponible y se puede reparar ese día.

Por lo tanto, supongo que mi problema aquí es donde incluso empezar con esto. DAX y yo no nos llevamos muy bien, así que estoy realmente contra una pared en éste.

Mi otro pensamiento, basado en la experiencia de todos aquí, ¿es esto incluso algo que se puede manejar con DAX? ¿O debo mover esta transformación más atrás en mi pila y hacerla en el servidor en Javascript antes de que se envíe a través de la API a PowerBI?

1 ACCEPTED SOLUTION

Hola @elietech .

El error estaba relacionado con el cálculo cuando tienes un solo día, ya lo solucioné cambiando la fórmula a:

measure = 
VAR Date_Selection =
    MAX ( 'Dates'[Date] )
VAR Date_Selection_Next = Date_Selection + 1
VAR temp_table =
    FILTER (
        ADDCOLUMNS (
            UpDown;
            "Start";
                DATE ( YEAR ( UpDown[DOWN_START] ); MONTH ( UpDown[DOWN_START] ); DAY ( UpDown[DOWN_START] ) );
            "End";
                DATE ( YEAR ( UpDown[DOWN_STOP] ); MONTH ( UpDown[DOWN_STOP] ); DAY ( UpDown[DOWN_STOP] ) )
        );
        [Start] <= Date_Selection
            && [End] >= Date_Selection
    )
VAR DateStart =
    IF (
        MINX ( temp_table; UpDown[DOWN_START] ) <= Date_Selection;
        Date_Selection;
        MINX ( temp_table; UpDown[DOWN_START] )
    )
VAR DateEnd =
    IF (
        MAXX ( temp_table; UpDown[DOWN_STOP] ) >= Date_Selection_Next;
        Date_Selection_Next;
        MAXX ( temp_table; UpDown[DOWN_STOP] )
    )
VAR Same_day_selection =
    IF (
        MAXX ( temp_table; [Start] ) = MINX ( temp_table; [End] )
            && MINX ( temp_table; UpDown[DOWN_START] ) >= Date_Selection;
        1
    )
RETURN
    IF (
        DateEnd = BLANK ();
        1440;
        IF (
            Same_day_selection = BLANK ();
            DATEDIFF ( Date_Selection; DateStart; MINUTE )
                + DATEDIFF ( DateEnd; Date_Selection_Next; MINUTE );
            1440
                - CALCULATE (
                    SUM ( UpDown[DOWN_DURATION] );
                    FILTER ( temp_table; UpDown[DOWN_START] = DateStart )
                )
        )
    )

Compruebe el resultado a continuación y adjúntelo.

MFelix_0-1601547798420.png


Regards

Miguel Félix


Did I answer your question? Mark my post as a solution!

Proud to be a Super User!

Check out my blog: Power BI em Português



View solution in original post

10 REPLIES 10
MFelix
Super User
Super User

Hola @elietech ,

Mirando su información esto es posible sin embargo usted necesita dar alguna información adicional sobre su Modelo.

Asumo que tienes una tabla de equimentes que está relacionada con tu down. Cree una tabla de calendario desconectada para el filtro y agregue la siguiente medida:

Measure = 
VAR Date_Selection =
    MAX ( 'calendar'[Date] )
VAR Date_Selection_Next = Date_Selection + 1
VAR temp_table =
    FILTER (
        ADDCOLUMNS (
            Up_Down;
            "Start";
                DATE ( YEAR ( Up_Down[Down_start] ); MONTH ( Up_Down[Down_start] ); DAY ( Up_Down[Down_start] ) );
            "End";
                DATE ( YEAR ( Up_Down[Down_Stop] ); MONTH ( Up_Down[Down_Stop] ); DAY ( Up_Down[Down_Stop] ) )
        );
        [Start] <= Date_Selection
            && [End] >= Date_Selection
    )
VAR DateStart =
    IF (
        MINX ( temp_table; Up_Down[Down_start] ) <= Date_Selection;
        Date_Selection;
        MINX ( temp_table; Up_Down[Down_start] )
    )
VAR DateEnd =
    IF (
        MAXX ( temp_table; Up_Down[Down_Stop] ) >= Date_Selection_Next;
        Date_Selection_Next;
        MAXX ( temp_table; Up_Down[Down_Stop] )
    )
VAR Same_day_selection =
    IF (
        MAXX ( temp_table; [Start] ) = MINX ( temp_table; [End] )
            && MINX ( temp_table; Up_Down[Down_start] ) >= Date_Selection;
        1
    )
RETURN
    IF (
        DateEnd = BLANK ();
        1440;
        IF (
            Same_day_selection = BLANK ();
            DATEDIFF ( Date_Selection; DateStart; MINUTE )
                + DATEDIFF ( DateEnd; Date_Selection_Next; MINUTE );
            1440
                - SUM ( Up_Down[Down_duration] ) * 1440
        )
    )

Compruebe el resultado final en la conexión de archivo PBIX.


Regards

Miguel Félix


Did I answer your question? Mark my post as a solution!

Proud to be a Super User!

Check out my blog: Power BI em Português



Lo sentimos por la respuesta retrasada... esto parece muy prometedor.... una pregunta rápida antes de empezar a cavar en ella.... mi modelo ya contiene una tabla "fecha/calendario"... ¿tendría que hacer otra? ¿O puedo usar el existente? Y sí, tengo una tabla "Equipo" que es relacionable con los datos de eventos Up/Down....

No puedo esperar para probar esto... definitivamente un nivel de DAX más allá de lo que normalmente soy capaz de soñar por mi cuenta 🙂 estoy constantemente sorprendido por la ayuda y el apoyo que puedo encontrar en esta comunidad.

Hola @elietech,

Utilizo una tabla no relacionada, pero el uso de esta otra tabla depende de la relación que tenga en su modelo.

¿Cómo se relaciona la tabla de fechas con las otras tablas del modelo?


Regards

Miguel Félix


Did I answer your question? Mark my post as a solution!

Proud to be a Super User!

Check out my blog: Power BI em Português



Ok, así que implementé su código DAX recomendado, y parece funcionar, en la mayoría de las situaciones, pero estoy recibiendo algunos resultados extraños de números negativos muy grandes, y no puedo determinar la causa. Me burlé de un informe usando un mes de mis datos, y he adjuntado el archivo PBIX... una idea sobre por dónde empezar?

elietech_0-1601492186998.png

Supongo que no puedo adjuntar archivos... aquí hay un enlace a mi archivo en Onedrive

https://1drv.ms/u/s!AswWQQBlp11ZvN1P6rRn-dCyWu7dbw?e=9Hho0X

Hola @elietech .

El error estaba relacionado con el cálculo cuando tienes un solo día, ya lo solucioné cambiando la fórmula a:

measure = 
VAR Date_Selection =
    MAX ( 'Dates'[Date] )
VAR Date_Selection_Next = Date_Selection + 1
VAR temp_table =
    FILTER (
        ADDCOLUMNS (
            UpDown;
            "Start";
                DATE ( YEAR ( UpDown[DOWN_START] ); MONTH ( UpDown[DOWN_START] ); DAY ( UpDown[DOWN_START] ) );
            "End";
                DATE ( YEAR ( UpDown[DOWN_STOP] ); MONTH ( UpDown[DOWN_STOP] ); DAY ( UpDown[DOWN_STOP] ) )
        );
        [Start] <= Date_Selection
            && [End] >= Date_Selection
    )
VAR DateStart =
    IF (
        MINX ( temp_table; UpDown[DOWN_START] ) <= Date_Selection;
        Date_Selection;
        MINX ( temp_table; UpDown[DOWN_START] )
    )
VAR DateEnd =
    IF (
        MAXX ( temp_table; UpDown[DOWN_STOP] ) >= Date_Selection_Next;
        Date_Selection_Next;
        MAXX ( temp_table; UpDown[DOWN_STOP] )
    )
VAR Same_day_selection =
    IF (
        MAXX ( temp_table; [Start] ) = MINX ( temp_table; [End] )
            && MINX ( temp_table; UpDown[DOWN_START] ) >= Date_Selection;
        1
    )
RETURN
    IF (
        DateEnd = BLANK ();
        1440;
        IF (
            Same_day_selection = BLANK ();
            DATEDIFF ( Date_Selection; DateStart; MINUTE )
                + DATEDIFF ( DateEnd; Date_Selection_Next; MINUTE );
            1440
                - CALCULATE (
                    SUM ( UpDown[DOWN_DURATION] );
                    FILTER ( temp_table; UpDown[DOWN_START] = DateStart )
                )
        )
    )

Compruebe el resultado a continuación y adjúntelo.

MFelix_0-1601547798420.png


Regards

Miguel Félix


Did I answer your question? Mark my post as a solution!

Proud to be a Super User!

Check out my blog: Power BI em Português



Increíble. Gracias por su ayuda. Esto parece ser exactamente la solución a mi problema. Realmente necesito subir de nivel mis habilidades con DAX aparentemente.

Hola @MFelix, tal vez si pudiera molestarte con un pequeño seguimiento de este...

Cuando comencé a integrar esto en mi informe de BI existente, noté una pequeña limitación con esta medida... o tal vez es una limitación conmigo.... de cualquier manera, me preguntaba:

Parece que esta medida funciona muy bien, a un nivel súper granular; específicamente en el número de horas disponibles por recurso por día. Pero no parece funcionar si quiero mirar algo como decir, número total de horas disponibles por día para todos los recursos... para tratar de obtener una idea general de la capacidad de servicio general, o por grupo de recursos (dejé fuera esa información de los datos de ejemplo anteriores que envié, pero dicen que cada recurso pertenece a un grupo, y hay alrededor de 5 o 6 grupos diferentes en total)

¿Podría adaptarse esta medida para que también funcione para estos escenarios? ¿O se requeriría una medida diferente?

Hola @elietech ,

Como me referí, necesita crear una medida diferente basada en su contexto en mi caso he hecho un cálculo para los días y la identificación

Measure 2 = IF(ISINSCOPE(Dates[Date]);[measure]; SUMX(Dates;SUMX(ALLSELECTED(UpDown[RES_ID]);[measure])))

Debe cambiar los dos valores de SUMX en función de la agregación que necesite. Tenga en cuenta que el uso de las tablas desconectadas y la SUMX puede traer algunos problemas de rendimiento dependiendo del tamaño del modelo de datos.

Compruebe la conexión del archivo PBIX.


Regards

Miguel Félix


Did I answer your question? Mark my post as a solution!

Proud to be a Super User!

Check out my blog: Power BI em Português



Hola @elietech ,

Esta medida puede ser adaptador para hacer un SUMX (fórmula de agregador) basado en la fecha, por ejemplo, la única pregunta aquí es que necesita adaptarlo a cada una de las categorizaciones que necesita, por lo que si es por día o por máquina o por otro grupo.

Voy a tratar de darte un poco de puntero mañana ok?


Regards

Miguel Félix


Did I answer your question? Mark my post as a solution!

Proud to be a Super User!

Check out my blog: Power BI em Português



¡Gran! Absolutamente ninguna prisa en absoluto, se lo agradezco!

Helpful resources

Announcements
April AMA free

Microsoft Fabric AMA Livestream

Join us Tuesday, April 09, 9:00 – 10:00 AM PST for a live, expert-led Q&A session on all things Microsoft Fabric!

March Fabric Community Update

Fabric Community Update - March 2024

Find out what's new and trending in the Fabric Community.

Top Solution Authors