I think join could be faster. In my example the DateTime-Columns are TEXT, so I converted them to DateTime. If your source has DateTime-Columns you haven't to do this step and save time.
I create a list for all relevant dates per 'Empl ID' for every 15 Minutes.
(In your Lookup-Table examples there are time in 15 Min. step, you can change the M-Code to every Minute if necessary )
/*Source Table*/
let
Quelle = Excel.CurrentWorkbook(){[Name="Source_Table"]}[Content],
Custom_StartDateTimeNew = Table.AddColumn(Quelle, "Start DateTimeNew", each
#datetime(Date.Year(DateTime.LocalNow()),
Number.From(Text.BeforeDelimiter([#"Start DateTime "], "/")),
Number.From(Text.BetweenDelimiters([#"Start DateTime "], "/", " ")),
Time.Hour(Time.From(Text.AfterDelimiter([#"Start DateTime "], " "))),
Time.Minute(Time.From(Text.AfterDelimiter([#"Start DateTime "], " "))), 0)
, type datetime),
Custom_EndDateTimeNew = Table.AddColumn(Custom_StartDateTimeNew, "End DateTimeNew", each
#datetime(Date.Year(DateTime.LocalNow()),
Number.From(Text.BeforeDelimiter([#"End DateTime"], "/")),
Number.From(Text.BetweenDelimiters([#"End DateTime"], "/", " ")),
Time.Hour(Time.From(Text.AfterDelimiter([#"End DateTime"], " "))),
Time.Minute(Time.From(Text.AfterDelimiter([#"End DateTime"], " "))), 0)
, type datetime),
Custom_ListDateTime = Table.AddColumn(Custom_EndDateTimeNew, "List DateTime", each
List.DateTimes([Start DateTimeNew],
(Number.From([End DateTimeNew] - [Start DateTimeNew]))*96+1,
#duration(0,0,15,0))),
Expand_ListDateTime = Table.ExpandListColumn(Custom_ListDateTime, "List DateTime")
in
Expand_ListDateTime
Lookup:
/*Lookup Table*/
let
Quelle = Excel.CurrentWorkbook(){[Name="Lookup_Table"]}[Content],
#"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"Empl ID ", Int64.Type}, {"Action DateTime", type text}, {"Result", type text}}),
Custom_ActionDateTimeNew = Table.AddColumn(#"Geänderter Typ", "Action DateTimeNew", each
#datetime(Date.Year(DateTime.LocalNow()),
Number.From(Text.BeforeDelimiter([#"Action DateTime"], "/")),
Number.From(Text.BetweenDelimiters([#"Action DateTime"], "/", " ")),
Time.Hour(Time.From(Text.AfterDelimiter([#"Action DateTime"], " "))),
Time.Minute(Time.From(Text.AfterDelimiter([#"Action DateTime"], " "))), 0))
in
Custom_ActionDateTimeNew
Result
/*Result Table*/
let
Quelle = Table.NestedJoin(Source_Table, {"Empl ID ", "List DateTime"}, Lookup_Table, {"Empl ID ", "Action DateTimeNew"}, "Lookup_Table", JoinKind.LeftOuter),
Expand_Lookup_Table = Table.ExpandTableColumn(Quelle, "Lookup_Table", {"Action DateTime", "Result"}, {"Action DateTime", "Result"}),
RemoveOtherColumns = Table.SelectColumns(Expand_Lookup_Table,{"Empl ID ", "Start DateTime ", "End DateTime", "Action DateTime", "Result"}),
#"Gruppierte Zeilen" = Table.Group(RemoveOtherColumns, {"Empl ID ", "Start DateTime ", "End DateTime"}, {{"Action DateTime", each List.Max([Action DateTime]), type nullable text}, {"Result", each List.Max([Result]), type nullable text}})
in
#"Gruppierte Zeilen"
![enter image description here](https://i.stack.imgur.com/iJjbl.jpg)