matty_a4d3
Hola tios,
Novato aquí, ¿sería posible crear una medida o una columna calculada para obtener la duración de cada tarea por ID?
El conjunto de datos sería así:
Gracias chicos por la ayuda !
nandukrishnavs
En respuesta a matty_a4d3
@matty_a4d3: si tiene varias tareas y se realiza en el orden correcto, puede probar la siguiente medida DAX.
Duration =
VAR _CurrentTaskTime =
CALCULATE ( SELECTEDVALUE ( 'Table'[DATE/TIME] ) )
VAR _PreviousTaskTime =
CALCULATE (
MAX ( 'Table'[DATE/TIME] ),
ALLEXCEPT ( 'Table', 'Table'[ID] ),
'Table'[DATE/TIME] < _CurrentTaskTime
)
VAR _timeDifference_IN_Minutes =
IF (
ISBLANK ( _PreviousTaskTime ),
0,
DATEDIFF ( _PreviousTaskTime, _CurrentTaskTime, MINUTE )
)
RETURN
_timeDifference_IN_Minutes
v-frfei-msft
Hola @matty_a4d3,
Aquí vamos:
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMtE3NNM3MjAyUDC0sDI2UdJRMgRir9Liksw8ICO4JLGoRClWB0WhpZWhKbrCgqL8lNLkksz8PDTVRgZWJhiqc0rzkjPQjTWD2G8EUphaXJyZnIjLAeZWppgq8bnA1BhDOdQJsQA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [#"Date/Time" = _t, ID = _t, Name = _t, Task = _t]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Date/Time", type datetime}, {"ID", Int64.Type}, {"Name", type text}, {"Task", type text}}),
Partition = Table.Group(Source, {"ID"}, {{"Partition", each Table.AddIndexColumn(_, "Index",1,1), type table}}),
#"Expanded Partition" = Table.ExpandTableColumn(Partition, "Partition", {"Date/Time", "Name", "Task", "Index"}, {"Partition.Date/Time", "Partition.Name", "Partition.Task", "Partition.Index"}),
#"Added Custom" = Table.AddColumn(#"Expanded Partition", "Custom", each [Partition.Index]-1),
#"Merged Queries" = Table.NestedJoin(#"Added Custom", {"ID", "Partition.Index"}, #"Added Custom", {"ID", "Custom"}, "Added Custom", JoinKind.LeftOuter),
#"Expanded Added Custom" = Table.ExpandTableColumn(#"Merged Queries", "Added Custom", {"Partition.Date/Time"}, {"Added Custom.Partition.Date/Time"}),
#"Added Custom1" = Table.AddColumn(#"Expanded Added Custom", "Custom.1", each if[#"Added Custom.Partition.Date/Time"] = null then [#"Partition.Date/Time"] else [#"Added Custom.Partition.Date/Time"]),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom1",{"Added Custom.Partition.Date/Time"}),
#"Changed Type1" = Table.TransformColumnTypes(#"Removed Columns",{{"Partition.Date/Time", type datetime}, {"Custom.1", type datetime}}),
#"Added Custom2" = Table.AddColumn(#"Changed Type1", "Custom.2", each [#"Partition.Date/Time"]-[Custom.1]),
#"Changed Type2" = Table.TransformColumnTypes(#"Added Custom2",{{"Custom.2", type duration}}),
#"Sorted Rows" = Table.Sort(#"Changed Type2",{{"ID", Order.Ascending}}),
#"Removed Columns1" = Table.RemoveColumns(#"Sorted Rows",{"Partition.Index", "Custom", "Custom.1"})
in
#"Removed Columns1"
matty_a4d3
En respuesta a v-frfei-msft
Hola,
Gracias por esto, lo probaré primero y luego te responderé.
Espero que esto funcione.
nandukrishnavs
@matty_a4d3 –
Pruebe la siguiente medida DAX.
Duration =
VAR _Task =
CALCULATE ( SELECTEDVALUE ( 'Table'[Task] ) )
VAR _ID =
CALCULATE ( SELECTEDVALUE ( 'Table'[ID] ) )
VAR _Start =
CALCULATE (
SELECTEDVALUE ( 'Table'[DATE/TIME] ),
ALLEXCEPT ( 'Table', 'Table'[ID] ),
'Table'[Task] = "Start"
)
VAR _ProductionTime =
CALCULATE (
SELECTEDVALUE ( 'Table'[DATE/TIME] ),
ALLEXCEPT ( 'Table', 'Table'[ID] ),
'Table'[Task] = "Production"
)
VAR _End =
CALCULATE (
SELECTEDVALUE ( 'Table'[DATE/TIME] ),
ALLEXCEPT ( 'Table', 'Table'[ID] ),
'Table'[Task] = "End"
)
VAR _ProdDuration =
DATEDIFF ( _Start, _ProductionTime, MINUTE )
VAR _EndDuration =
DATEDIFF ( _ProductionTime, _End, MINUTE )
VAR result =
SWITCH ( _Task, "Start", 0, "Production", _ProdDuration, "End", _EndDuration )
RETURN
result
Si encuentra útil esta solución, márquela como una solución aceptada.
Saludos,
nandu krishna
matty_a4d3
En respuesta a nandukrishnavs
Hola @nandukrishnavs,
¿Es esto también aplicable si agrego otra tarea como REUNIÓN y habrá momentos en que REUNIÓN sería la primera tarea que ALMUERZO o ALMUERZO sería la primera tarea que REUNIÓN?
nandukrishnavs
En respuesta a matty_a4d3
@matty_a4d3: si tiene varias tareas y se realiza en el orden correcto, puede probar la siguiente medida DAX.
Duration =
VAR _CurrentTaskTime =
CALCULATE ( SELECTEDVALUE ( 'Table'[DATE/TIME] ) )
VAR _PreviousTaskTime =
CALCULATE (
MAX ( 'Table'[DATE/TIME] ),
ALLEXCEPT ( 'Table', 'Table'[ID] ),
'Table'[DATE/TIME] < _CurrentTaskTime
)
VAR _timeDifference_IN_Minutes =
IF (
ISBLANK ( _PreviousTaskTime ),
0,
DATEDIFF ( _PreviousTaskTime, _CurrentTaskTime, MINUTE )
)
RETURN
_timeDifference_IN_Minutes
matty_a4d3
En respuesta a nandukrishnavs
Hola @nandukrishnavs,
Esto funciona muy bien, sin embargo, cuando otro ID de usuario marca otra tarea, la duración sigue contando. Debería volver a las 00:00:00 o el temporizador debería comenzar desde el último sello por ID de usuario.
Por favor, vea la siguiente captura de pantalla:
En la captura de pantalla anterior, observe que la identificación es diferente, pero la medida sigue contando desde el último sello, que es una identificación diferente.
Anónimo
En respuesta a nandukrishnavs
Advertencia
———
No haga esto con una medida compleja como se sugiere anteriormente. Te arrepentirás más temprano que tarde (confía en mí).
Utilice Power Query para preparar los datos por adelantado.
Si ignora esto, por favor no regrese y no me diga que no ha sido advertido. 🙂
Mejor
D
matty_a4d3
En respuesta a Anónimo
hola @Anonimo,
No puedo usar Power Query ya que estoy usando un conjunto de datos de transmisión para esto.
Anónimo
En respuesta a matty_a4d3
Mmm… Interesante. Dice que no puede usar PQ y la respuesta marcada a su pregunta contiene código PQ. Realmente lo encuentro raro y divertido al mismo tiempo. 🙂
Mejor
D
matty_a4d3
En respuesta a Anónimo
Hola @Anónimo,
Oh, lo siento, creo que he marcado la solución incorrecta. Mi error. Gracias por notarlo.
amichandak
@matty_a4d3, ¿cuál es el resultado esperado?
matty_a4d3
En respuesta a amichandak
La salida sería así.
Anónimo
En respuesta a matty_a4d3
Esta debe ser una columna calculada y debe realizarse en Power Query, no en DAX. Una vez que el modelo tiene una tabla con las tareas y sus duraciones, puede comenzar a escribir medidas.
Y así es cómo construir modelos correctos donde DAX es SIMPLE de escribir:
https://www.youtube.com/watch?v=78d6mwR8Gt
Mejor
D