Calculo de tiempo entre pasos en Power BI

Cuando se trata de normalizar o desnormalizar para simplificar un proceso hay muchos caminos, hace poco me tope con el siguiente escenario:

Una empresa tiene la información de personas y una serie de pasos que ejecuta cada persona en cada una de sus visitas a sus puntos de atención, de esta forma (Datos de ejemplo).

EjemploDatos

Si intentamos cruzar la información con una dimensión de tiempo nos encontraremos con una cantidad de relaciones inactivas (Aprenda a lidiar con ellas) que sería necesario activarlas a discreción para poder resolver los diferentes cálculos, de igual manera, si aparecen más pasos en el futuro esto podría ser un problema que queremos dejar resuelto desde ya.

Procedimos a realizar un pivot de los datos para tenerlos de esta forma:

Datos Después del Pivot

Posteriormente se separo la información de los pasos de la dimensión de tiempo asi:

Modelo de datos

La columna de Fecha en EntradasPorPersona corresponde a un número entero que cruza con la columna ID en la tabla Tiempo, la tabla de Tiempo se encuentra organizada y el ID es un autonumérico.

Calculo de tiempo entre pasos:

  1. Agregue la columna de fecha nuevamente, utilice la función RELATED() FechaOK = RELATED(Tiempo[FechaHora])
  2. Agregue una nueva columna que devuelva la fecha y hora inmediatamente anterior PasoAnterior = CALCULATE(MAX(EntradasPorPersona[FechaOK]), filter(EntradasPorPersona, EARLIER(EntradasPorPersona[Fecha])>EntradasPorPersona[Fecha]), filter(EntradasPorPersona, EARLIER(EntradasPorPersona[Persona])=EntradasPorPersona[Persona]))
  3. Agregue una columna con la diferencia en segundos entre estas 2 fechas DuracionEntrePasos = DATEDIFF(EntradasPorPersona[PasoAnterior], EntradasPorPersona[FechaOK], SECOND)

Calculo de tiempo total

  1. Agregue una columna con la fecha inicial PasoInicial = CALCULATE(min(EntradasPorPersona[FechaOK]), filter(EntradasPorPersona, EARLIER(EntradasPorPersona[Persona])=EntradasPorPersona[Persona]))
  2. Agregue una columna con la fecha final PasoFinal = CALCULATE(MAX(EntradasPorPersona[FechaOK]), filter(EntradasPorPersona, EARLIER(EntradasPorPersona[Persona])=EntradasPorPersona[Persona]))
  3. Agregue una columna con la diferencia en segundos entre estas 2 fechas DuracionTotalxPersona = DATEDIFF(EntradasPorPersona[PasoInicial], EntradasPorPersona[PasoFinal], SECOND)

Al final tendremos algo asi:

Resultado final

Descargue el archivo de ejemplo aquí