Hi,
I have 1500 unique IDs, everyday many are seen and some multiple times a day.
I would like to do a cumulative count and know how many days does it takes to see them all 1500, once it reaches that amount, the cumulative sum needs to reset for another count until the next time the goal is met.
I've done a running total after a grouped count by date, but my issue aside from the needed reset is that the duplicates needs to be removed based on the time period needed to attain the goal. If i'm grouping my IDs by date then i'm losing the ability to sort out duplicates...
So i'm guessing I need to first find how much time is needed, then remove the duplicates from a custom column spanning over its own run tower the goal, and then, calculate the running...
Here's an ugly paint mockup of what i'd like my final result to look like (I realize I need my date format to be date.time otherwise i'll never get a correct goal and it'll be tricky)
I've found this solution here from Lind25 but the syntax is wrong, maybe from a previous PQ version:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
AddedIndex = Table.AddIndexColumn(Source, "Index", 1, 1),
#"Added Custom" = Table.AddColumn(AddedIndex, "Running total reset", each List.Accumulate(List.FirstN(AddedIndex[Difference],[Index]),0,(state,current)=>if state+current > 60 then 0 else state+current))
in
#"Added Custom"
Any takers ? I'm completely lost on that one...
Thanks
Solved! Go to Solution.
@AlB You are right. I will think more on a potential non-recursive DAX approach, but it may not be possible.
Regards,
Pat
Hi @ziying35
I totally agree with you. The logic depends on the specifications.
I don't know if @Kiwizqt thought of a situation like the one you showed.
If it is important for him to distinguish situations, he can choose between red (mine) and blue (yours).
I just point out that the solution you intended may leave some transactions out of each completion block In this case the row n.90) , which I don't know is important or irrelevant.
Earlier I posted a solution using the List.Generate function, and I've simulated every possible scenario I can think of in the solution, so you'll see where I'm going with this.
Hi @ziying35
you are right. Your solution leaves no unassigned records for the various blocks.
I apologize for the oversight.
I applied your fix to the recursive function, but then misread the resulting table.
however, the difference in the result remains, which in some cases could be important.
At this point it must be @Kiwizqt who decides what is preferable for its purposes.
I try to give an extreme example, to clarify the difference between the two approaches.
Correct me if I'm wrong.
If on the day a block is completed, the last block ID is present several times, you get the last one, while I get the first one.
A consequence of this different choice is that the next block, in my case, starts from the same day and already contains an occurrence of this ID; in the case of the choice made by ZiYing, the next block does not start with the same ID and therefore the completion of the block also depends on the subsequent occurrence of this ID.
Obviously there is no right or wrong solution they are just different.
Yes, you have understood my line of thinking perfectly. There is strictly no right or wrong solution for either of us, and the final choice will be @Kiwizqt's actual needs
FYI that I thought of a way to do this with DAX and no recursion. See the attached pbix. There were only two cycles in the example data, so I made a mock table too with integer date values (table on right). I made a DAX calculated table with the start date of each cycle, and it would be easy to get the desired measures from it. It would also be possible to put this expression in a variable in a measure and calculate it dynamically (not sure how performant it will be at large scale, and doing it as a table was easier to troubleshoot). Here is the DAX expression that appears to work. Note the upper limit of the GENERATESERIES function should be changed to the max potential # of cycles).
CycleStarts2 =
VAR counts =
ADDCOLUMNS (
CROSSJOIN (
VALUES ( Seen2[Date] ),
VALUES ( Seen2[ID] )
),
"count",
VAR thisDate = Seen2[Date]
RETURN
CALCULATE (
COUNT ( Seen2[ID] ),
ALL ( Seen2[Date] ),
Seen2[Date] <= thisDate
) + 0
)
VAR mincounts =
ADDCOLUMNS (
SUMMARIZE (
counts,
Seen2[Date]
),
"mincount",
VAR thisDate = Seen2[Date]
RETURN
MINX (
FILTER (
counts,
Seen2[Date] = thisDate
),
[count]
)
)
VAR cycles2 =
ADDCOLUMNS (
GENERATESERIES (
1,
4,
1
),
"StartOfNewCycle",
MINX (
FILTER (
mincounts,
[mincount] = [Value]
),
Seen2[Date]
)
)
RETURN
cycles2
Regards,
Pat
About the changing the recursive code to implement the different logic suggested by @ziying35 , I would like to propose a different way of obtaining the same result.
In practice, this is done: take the last element of the first group of list of groups by day of the last group of list of groups by ID.
In M code, this becomes
let
completion = (tab) =>
let
grpID = Table.Group(tab, {"ID"}, {"grp", each _}),
nids = Table.RowCount(grpID),
currFirstDate = Table.First(List.First(grpID[grp]), "Date"),
currLastDate = Table.Last(
List.First(
Table.Group(
List.Last(grpID[grp]),
{"Date"},
{"idByday", each _},
GroupKind.Local,
(x, y) => Date.Day(x[Date]) - Date.Day(y[Date])
)[idByday]
),
"Date"
),
rest = Table.SelectRows(tab, each _[Date] > currLastDate[Date]),
result =
if Table.RowCount(Table.Distinct(rest, "ID")) < nids then
{[Start = currFirstDate, End = currLastDate]}
else
{[Start = currFirstDate, End = currLastDate]} & @completion(rest)
in
result
in
completion
This seems to yield the same erroneous result for the example I provided earlier, or am I mistaken? It is a very smart and elegant implementation but the logic for the core computation is essentially the same as before, thus carrying the same flaws. The code still looks, for cycle N, for the earliest date on which all IDs have been seen N times since the beginning. That does work for N=1 but not for N>1.
Best
Date | ID | |
1 | 100 | |
2 | 100 | |
3 | 100 | |
4 | 200 | |
5 | 200 | |
6 | 300 | <--1st period |
7 | 300 | <--2nd period |
8 | 200 | |
9 | 300 | <--3rd period |
It did work with the set I created but it did break down again when I threw other patterns at it. I had an extra virtual column in there that was more complex but closer to the solution I think. When I had both, the simpler one ("mincount") also worked (which I had created as part of the 2nd one), so I got rid of the more complex one. Below is a variation on it. I think this is close, but the last piece of logic is stumping me. It works by looking ahead and finding the next datetime where the running total count of each ID is different (i.e., at least +1) by using ISBLANK on the COUNTROWS of INTERSECT.
This has gotten pretty academic at this point, but here is the table expression if anyone is still following this one. It calculates against the Seen2 table I had in previous pbix with numeric "datetime" values. It shows when the next full cycle occurs from that point (date), but doesn't get it relative to the start (again, not recursive which may be the fundamental limitation).
CycleStarts4 =
VAR counts =
ADDCOLUMNS (
CROSSJOIN (
VALUES ( Seen2[Date] ),
VALUES ( Seen2[ID] )
),
"count",
VAR thisDate = Seen2[Date]
RETURN
CALCULATE (
COUNT ( Seen2[ID] ),
ALL ( Seen2[Date] ),
Seen2[Date] <= thisDate
) + 0
)
VAR withlast =
ADDCOLUMNS (
ADDCOLUMNS (
VALUES ( Seen2[Date] ),
"mincount",
VAR thisdate3 = Seen2[Date]
RETURN
MINX (
FILTER (
counts,
Seen2[Date] = thisdate3
),
[count]
)
),
"nextcyclestart",
VAR thisdate2 = Seen2[Date]
VAR thismin = [mincount]
VAR thisvalues =
SUMMARIZE (
FILTER (
counts,
Seen2[Date] = thisdate2
),
Seen2[ID],
[count]
)
VAR othervalues =
FILTER (
FILTER (
counts,
Seen2[Date] > thisdate2
),
ISBLANK (
VAR thisdate3 = Seen2[Date]
VAR prevvalues =
SUMMARIZE (
FILTER (
counts,
Seen2[Date] = thisdate3
),
Seen2[ID],
[count]
)
RETURN
COUNTROWS (
INTERSECT (
thisvalues,
prevvalues
)
)
)
)
RETURN
MINX (
othervalues,
Seen2[Date]
)
)
RETURN
withlast
Regards,
Pat
Dear Community Members, We'd like to let you know of an upcoming change to the community platform: starting July 16th, the platform will transition to a READ ONLY mode until July 22nd. During this period, members will not be able to Kudo, Comment, or Reply to any posts. On July 22nd, please be on the lookout for a message sent to the email address registered on your community profile. This email is crucial as it will contain your unique code and link to register for the new platform encompassing all of the communities. What to Expect in the New Community: A more unified experience where all products, including Power Apps, Power Automate, Copilot Studio, and Power Pages, will be accessible from one community.Community Blogs that you can syndicate and link to for automatic updates. We appreciate your understanding and cooperation during this transition. Stay tuned for the exciting new features and a seamless community experience ahead!
We are excited to announce the Summer of Solutions Challenge! This challenge is kicking off on Monday, June 17th and will run for (4) weeks. The challenge is open to all Power Platform (Power Apps, Power Automate, Copilot Studio & Power Pages) community members. We invite you to participate in a quest to provide solutions in the Forums to as many questions as you can. Answers can be provided in all the communities. Entry Period: This Challenge will consist of four weekly Entry Periods as follows (each an “Entry Period”) - 12:00 a.m. PT on June 17, 2024 – 11:59 p.m. PT on June 23, 2024 - 12:00 a.m. PT on June 24, 2024 – 11:59 p.m. PT on June 30, 2024 - 12:00 a.m. PT on July 1, 2024 – 11:59 p.m. PT on July 7, 2024 - 12:00 a.m. PT on July 8, 2024 – 11:59 p.m. PT on July 14, 2024 Entries will be eligible for the Entry Period in which they are received and will not carryover to subsequent weekly entry periods. You must enter into each weekly Entry Period separately. How to Enter: We invite you to participate in a quest to provide "Accepted Solutions" to as many questions as you can. Answers can be provided in all the communities. Users must provide a solution which can be an “Accepted Solution” in the Forums in all of the communities and there are no limits to the number of “Accepted Solutions” that a member can provide for entries in this challenge, but each entry must be substantially unique and different. Winner Selection and Prizes: At the end of each week, we will list the top ten (10) Community users which will consist of: 5 Community Members & 5 Super Users and they will advance to the final drawing. We will post each week in the News & Announcements the top 10 Solution providers. At the end of the challenge, we will add all of the top 10 weekly names and enter them into a random drawing. Then we will randomly select ten (10) winners (5 Community Members & 5 Super Users) from among all eligible entrants received across all weekly Entry Periods to receive the prize listed below. If a winner declines, we will draw again at random for the next winner. A user will only be able to win once overall. If they are drawn multiple times, another user will be drawn at random. Individuals will be contacted before the announcement with the opportunity to claim or deny the prize. Once all of the winners have been notified, we will post in the News & Announcements of each community with the list of winners. Each winner will receive one (1) Pass to the Power Platform Conference in Las Vegas, Sep. 18-20, 2024 ($1800 value). NOTE: Prize is for conference attendance only and any other costs such as airfare, lodging, transportation, and food are the sole responsibility of the winner. Tickets are not transferable to any other party or to next year’s event. ** PLEASE SEE THE ATTACHED RULES for this CHALLENGE** Week 1 Results: Congratulations to the Week 1 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Community MembersNumber of SolutionsSuper UsersNumber of Solutions @anandm08 23 @WarrenBelz 31 @DBO_DV 10 @Amik 19 AmínAA 6 @mmbr1606 12 @rzuber 4 @happyume 7 @Giraldoj 3@ANB 6 (tie) @SpongYe 6 (tie) Week 2 Results: Congratulations to the Week 2 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Community MembersSolutionsSuper UsersSolutions @anandm08 10@WarrenBelz 25 @DBO_DV 6@mmbr1606 14 @AmínAA 4 @Amik 12 @royg 3 @ANB 10 @AllanDeCastro 2 @SunilPashikanti 5 @Michaelfp 2 @FLMike 5 @eduardo_izzo 2 Meekou 2 @rzuber 2 @Velegandla 2 @PowerPlatform-P 2 @Micaiah 2 Week 3 Results: Congratulations to the Week 3 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Week 3:Community MembersSolutionsSuper UsersSolutionsPower Apps anandm0861WarrenBelz86DBO_DV25Amik66Michaelfp13mmbr160647Giraldoj13FLMike31AmínAA13SpongYe27 Week 4 Results: Congratulations to the Week 4 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Week 4:Community MembersSolutionsSuper UsersSolutionsPower Apps DBO-DV21WarranBelz26Giraldoj7mmbr160618Muzammmil_0695067Amik14samfawzi_acml6FLMike12tzuber6ANB8 SunilPashikanti8
On July 16, 2024, we published the 2024 release wave 2 plans for Microsoft Dynamics 365 and Microsoft Power Platform. These plans are a compilation of the new capabilities planned to be released between October 2024 to March 2025. This release introduces a wealth of new features designed to enhance customer understanding and improve overall user experience, showcasing our dedication to driving digital transformation for our customers and partners. The upcoming wave is centered around utilizing advanced AI and Microsoft Copilot technologies to enhance user productivity and streamline operations across diverse business applications. These enhancements include intelligent automation, AI-powered insights, and immersive user experiences that are designed to break down barriers between data, insights, and individuals. Watch a summary of the release highlights. Discover the latest features that empower organizations to operate more efficiently and adaptively. From AI-driven sales insights and customer service enhancements to predictive analytics in supply chain management and autonomous financial processes, the new capabilities enable businesses to proactively address challenges and capitalize on opportunities.
We're embarking on a journey to enhance your experience by transitioning to a new community platform. Our team has been diligently working to create a fresh community site, leveraging the very Dynamics 365 and Power Platform tools our community advocates for. We started this journey with transitioning Copilot Studio forums and blogs in June. The move marks the beginning of a new chapter, and we're eager for you to be a part of it. The rest of the Power Platform product sites will be moving over this summer. Stay tuned for more updates as we get closer to the launch. We can't wait to welcome you to our new community space, designed with you in mind. Let's connect, learn, and grow together. Here's to new beginnings and endless possibilities! If you have any questions, observations or concerns throughout this process please go to https://aka.ms/PPCommSupport. To stay up to date on the latest details of this migration and other important Community updates subscribe to our News and Announcements forums: Copilot Studio, Power Apps, Power Automate, Power Pages