Forum Discussion
Power Query Grouping challenge
- 3 years ago
Try this version that fixes overnight issue. I've had to create your buckets as DateTime values to account for the date change overnight, but you can easily change this back to Time type afterwards if you prefer:
let Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("Tc3RDcAgCATQXfg2KRxilVUa91+jWisxIbmPx8HzEMs1BgylRNxcbGU26mkxNgu71JniGcEaXJx55dHOwc0VIyFud7Adv7/2SLTgElzn0b22+d4M/dvsvH6rXIKDrUwWR6XeXw==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Date_ = _t, start = _t, stop = _t]), chgTypes = Table.TransformColumnTypes(Source,{{"start", type time}, {"stop", type time}, {"Date_", type date}}), addHalfHourBins = Table.AddColumn( chgTypes, "halfHourBins", each let startDateTime = DateTime.From([Date_] & [start]), stopDateTime = if [stop] < [start] then DateTime.From(Date.AddDays([Date_], 1) & [stop]) else DateTime.From([Date_] & [stop]), startHalfHour = DateTime.From(Number.RoundDown(48 * Number.From(startDateTime) / 1 ) / 48), stopHalfHour = DateTime.From(Number.RoundUp(48 * Number.From(stopDateTime) / 1 ) / 48) in List.DateTimes( startHalfHour, Duration.TotalMinutes(stopHalfHour - startHalfHour) / 30, #duration(0,0,30,0) ) ), expandHalfHourBins = Table.ExpandListColumn(addHalfHourBins, "halfHourBins"), addHalfHourBinDuration = Table.AddColumn( expandHalfHourBins, "halfHourBinDuration", each let startDateTime = DateTime.From([Date_] & [start]), stopDateTime = if [stop] < [start] then DateTime.From(Date.AddDays([Date_], 1) & [stop]) else DateTime.From([Date_] & [stop]) in Duration.TotalMinutes( List.Min({stopDateTime, [halfHourBins] + #duration(0,0,30,0)}) - List.Max({startDateTime, [halfHourBins]}) ) ) in addHalfHourBinDurationPete
- 3 years ago
Ok, so here's the basics:
addHalfHourBins = //'let..in' lets us declare variables for later use startDateTime = DateTime.From([Date_] & [start]) //This creates datetime values from date and time (so we can handle date changes). stopDateTime = if [stop] < [start] then DateTime.From(Date.AddDays([Date_], 1) & [stop]) else DateTime.From([Date_] & [stop]) //This does the same but adds a day to datetime if stop time is before start time. startHalfHour = DateTime.From(Number.RoundDown(48 * Number.From(startDateTime) / 1 ) / 48) //This rounds down the datetime value to the nearest half hour to provide the first value in our list of half-hours. It essentially converts the time to a decimal value, rounds down to the nearest half hour (this is the 48 bit - there's 48 half-hours in a day), then converts back to datetime. stopHalfHour = DateTime.From(Number.RoundUp(48 * Number.From(stopDateTime) / 1 ) / 48) //Same as above, but rounds up so we know where the list needs to end. List.DateTimes( //This creates a list of datetimes startHalfHour, //List starting value. Duration.TotalMinutes(stopHalfHour - startHalfHour) / 30, //How many list items to generate. #duration(0,0,30,0) //What time increments to use for each list item. )Hopefully the rest is fairly self-explanatory, but let me know if there'sanything else you're struggling with.
Also, feel free to give a thumbs-up on any posts that have helped you - that helps me keep doing my thang 🙂
Pete
Hi BA_Pete
thanl you
- i still get an issue at some stage with same error even if i take grouping out increment argument out if range error
- BA_Pete3 years agoSuper User
It sounds like the code has got corrupted somewhere.
If you start from the Source step and click through each step one by one, this should identify exactly which step is causing the error. If it's one of my steps, then you'll need to copy the code out of Advanced Editor for the whole query and paste it into a code window ( </> button ) here. Make sure to anonymise any connection strings etc.
Pete
- ttttttt3 years agoRegular Visitor
Hi BA_Pete - for some reason it wouldnt let me sign or respond from my account so had to recreate a username an register to post from a different device
This is the full code but im still getting that same error
let Source = Access.Database(File.Contents("S:\CR\Secure\P&S Resource Planning\Hub\Databases\Planning Pack Database\Results_Shrinkage.accdb"), [CreateNavigationProperties=true]), _tbl_Rolling_WFM_agentResults_PP = Source{[Schema="",Item="tbl_Rolling_WFM_agentResults_PP"]}[Data], #"Changed Type" = Table.TransformColumnTypes(_tbl_Rolling_WFM_agentResults_PP,{{"Date_", type date}}), #"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"TZ", "custID", "acdID", "logonID", "ssn", "modify"}), #"Changed Type1" = Table.TransformColumnTypes(#"Removed Columns",{{"start", type time}, {"stop", type time}}), #"Filtered Rows" = Table.SelectRows(#"Changed Type1", each [muID] = 2005), #"Filtered Rows1" = Table.SelectRows(#"Filtered Rows", each Date.IsInPreviousNDays([Date_], 3)), addHalfHourBins = Table.AddColumn( #"Filtered Rows1", "halfHourBins", each let startHalfHour = Time.From(Number.RoundDown(48 * Number.From([start]) / 1 ) / 48), endHalfHour = Time.From(Number.RoundUp(48 * Number.From([stop]) / 1 ) / 48) in List.Times( startHalfHour, Duration.TotalMinutes(endHalfHour - startHalfHour) / 30, #duration(0,0,30,0) ) ), expandHalfHourBins = Table.ExpandListColumn(addHalfHourBins, "halfHourBins"), addHalfHourBinDuration = Table.AddColumn( expandHalfHourBins, "halfHourBinDuration", each Duration.TotalMinutes( List.Min({[stop], [halfHourBins] + #duration(0,0,30,0)}) - List.Max({[start], [halfHourBins]}) ) ) in addHalfHourBinDuration- BA_Pete3 years agoSuper User
No problem.
My initial guess is that you have some start/stop times that go over midnight.
Are you able to share an example of your actual data as at your #"Filtered Rows1" step please?
you can select this query step, copy the whole table (if below 3,000 cells total), paste into 'Enter Data' then copy the M code form that query and paste here.
Pete