So I have been watching the videos created for “New Customer Analysis” and downloaded the sample PBIX file to follow the logic. I was able to create the formulas needed from the perspective of students in higher education versus customers as presented in the videos and demo file.
But a couple of things that are different for me and I may be missing the mark on include:
-
A student is considered new if they have gone a full 12 months without taking a course which means they have to reapply for admission. So I set up the Churn Time Frame to be based on 365 days. So Churn Time Frame = GENERATESERIES(0, 730, 21) because there is a way for a student to keep themselves active for 24 months by doing a future registration beyond the current date and Churn Time Frame Value = SELECTEDVALUE(‘Churn Time Frame’[Churn Time Frame], 365)
-
Because the term start date is one specific date in a month versus us having a date the student actually registered my version of the Sales table which would be a Registrations table does not exactly line up and the day of the month that a term will start is not always a perfect 30 days or 21 days after the previous term month. Each month of the year is a term month and terms last 3 months. My Date table is created based on my academic year structure. If I create formulas like All Students = COUNTROWS( ALL( ‘WW Registrations’[Student ID])) then I end up with a count of every single student across all 5 academic years so when I do a Continuing Student Formula (my version of your Steady Customer) formula the number just gets larger but without respect to the academic year which is what I want it to do. Introducing logic to make it respect academic year boundaries does not yield a usable result as it all becomes 0.
I think my problems boil down trying to translate the videos and logic you provided into logic that fits my model and unique scenario dealing with students who have multiple registrations in a single term and the dates in the term are the same so there is no true date of sale or date the student registered there is only the date the term actually starts.
Below is every one of your formulas that I translated for my unique scenario. I basically want to see truly how many students in a given term are new because there is no registration for them within the last 365 days.
New Students =
VAR StudentTM = VALUES('WW Registrations'[Student ID])
VAR PriorStudents = CALCULATETABLE( VALUES( 'WW Registrations'[Student ID]),
FILTER(ALL(Dates),
Dates[Date] > MIN(Dates[Date]) - 'Churn Time Frame'[Churn Time Frame Value] &&
Dates[Date] < MIN(Dates[Date]) ) )
RETURN
COUNTROWS(
EXCEPT(StudentTM, PriorStudents) )
New Student Registrations =
VAR StudentTM = VALUES('WW Registrations'[Student ID])
VAR PriorStudents = CALCULATETABLE( VALUES( 'WW Registrations'[Student ID]),
FILTER(ALL(Dates),
Dates[Date] > MIN(Dates[Date]) - 'Churn Time Frame'[Churn Time Frame Value] &&
Dates[Date] <= MIN(Dates[Date]) ) )
RETURN
CALCULATE( [Total Registrations],
EXCEPT( StudentTM, PriorStudents) )
Continuing Students = [Unique Students] - [New Students]
I used my unique student formula because the All Students measure did nothing. But the Unique Student Formula seems to also do nothing. Unique Students = COUNTROWS( VALUES( ‘WW Registrations’[Student ID])) but it is the same formula as the All Students Formula just with a different name.
Lost Students =
VAR StudentRegistered = CALCULATETABLE( VALUES( 'WW Registrations'[Student ID] ),
FILTER( ALL( Dates ),
Dates[Date] > MIN( Dates[Date] ) - 365 &&
Dates[Date] <= MIN( Dates[Date] ) - [Churn Time Frame Value] ) )
VAR PriorStudents = CALCULATETABLE( VALUES( 'WW Registrations'[Student ID]),
FILTER( ALL( Dates ),
Dates[Date] > MAX( Dates[Date] ) - [Churn Time Frame Value] &&
Dates[Date] <= MAX( Dates[Date] ) ) )
RETURN
COUNTROWS( EXCEPT( StudentRegistered, PriorStudents ) ) * -1