Forum Discussion
lucasneedhelp
2 years agoHelper I
Calculated Column between start time from current row and end time from previous row
Hi All, I'm have a set of data already formated and sorted by space and start time. I'm trying to add a column to say if space is the same as previous row, calculate start time from current row - en...
- 2 years ago
Hi lucasneedhelp ,
One way to do it is to create two offset Index columns and merge the table on itself using [SPACE] & [Index0] = [SPACE] & [Index1], like this:
let Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WcnRyVtJRMjLUNzDTNzIwMlUwMLMyMAAikKgRXNTI2MrUEiQaqwPXY4rQA9RgCNVjhl2Pi6sbUNbYQN/QECRrjKzHwFDf0AgqCrM9NhYA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [SPACE = _t, #"START TIME" = _t, #"END TIME" = _t]), // Relevant steps from here ====> addIndex1 = Table.AddIndexColumn(Source, "Index1", 1, 1, Int64.Type), addIndex0 = Table.AddIndexColumn(addIndex1, "Index0", 0, 1, Int64.Type), mergeOnSelf = Table.NestedJoin(addIndex0, {"SPACE", "Index0"}, addIndex0, {"SPACE", "Index1"}, "addIndex0", JoinKind.LeftOuter), expandEndTime = Table.ExpandTableColumn(mergeOnSelf, "addIndex0", {"END TIME"}, {"END TIME PREV ROW"}), // <==== Relevant steps end here sortIndex0 = Table.Sort(expandEndTime,{{"Index0", Order.Ascending}}), remOthCols = Table.SelectColumns(sortIndex0,{"SPACE", "START TIME", "END TIME", "END TIME PREV ROW"}) in remOthColsTo get this output:
Pete
- 2 years ago
hi, lucasneedhelp funny recursion
f = (i, lst, space, etime) => if rows{i}? = null then lst else @f( i + 1, lst & {rows{i} & [diff = if (rows{i}[SPACE] <> space or space = null) then null else rows{i}[START TIME] - etime ] }, rows{i}[SPACE], rows{i}[END TIME] ), rows = List.Buffer(Table.ToRecords(your_table)), z = Table.FromRecords(f(0, {}, null, null))
BA_Pete
2 years agoSuper User
Hi lucasneedhelp ,
One way to do it is to create two offset Index columns and merge the table on itself using [SPACE] & [Index0] = [SPACE] & [Index1], like this:
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WcnRyVtJRMjLUNzDTNzIwMlUwMLMyMAAikKgRXNTI2MrUEiQaqwPXY4rQA9RgCNVjhl2Pi6sbUNbYQN/QECRrjKzHwFDf0AgqCrM9NhYA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [SPACE = _t, #"START TIME" = _t, #"END TIME" = _t]),
// Relevant steps from here ====>
addIndex1 = Table.AddIndexColumn(Source, "Index1", 1, 1, Int64.Type),
addIndex0 = Table.AddIndexColumn(addIndex1, "Index0", 0, 1, Int64.Type),
mergeOnSelf = Table.NestedJoin(addIndex0, {"SPACE", "Index0"}, addIndex0, {"SPACE", "Index1"}, "addIndex0", JoinKind.LeftOuter),
expandEndTime = Table.ExpandTableColumn(mergeOnSelf, "addIndex0", {"END TIME"}, {"END TIME PREV ROW"}),
// <==== Relevant steps end here
sortIndex0 = Table.Sort(expandEndTime,{{"Index0", Order.Ascending}}),
remOthCols = Table.SelectColumns(sortIndex0,{"SPACE", "START TIME", "END TIME", "END TIME PREV ROW"})
in
remOthCols
To get this output:
Pete
- lucasneedhelp2 years agoHelper I
Thanks Pete. the script seems a bit too advanced for me. but i'll give it a go.
- lucasneedhelp2 years agoHelper I
Hey Pete, this works perfectly for me!
Brilliant!!!!!