Forum Discussion
Time Intelligence: Calculating averages across various time-periods
- 10 years ago
Ah, I use DateStream as well. I am wondering if you might try this. In your GlobalPMS table, create a calculated column such as:
Year Entered = YEAR([DateEntered])
Make sure it is a numeric field.
Then, change your formula to:
TEST Ent 2015 Avg. Admin: = CALCULATE([Avg. Admin Score:],GlobalPMS[Year Entered] = 2015)
And see if that comes back correctly.
- 10 years ago
Something that might be helpful in the future.
We (my peers and I who work for a BI consultancy), try to avoid calculated columns as much as possible, and similarly to avoid setting custom formatting in Power BI / Power Pivot / Tabular on fields. If you have a field that you want to display a certain way, it's usually because you want to use it as a label somewhere - that's why you want to control its display. If it's a label, it should either be a raw number (rare, the only common example I can think of is year - even decimal or float types are best avoided because you can display fewer significant digits than exist) or a string. Anything else can and will not be consistent due to locale and region settings on the client computer. Strings will always display identically. Whole numbers will potentially have a different 1000 separator. Dates will never display the way you want unless they are formatted as strings.
Additionally, calculated fields do not benefit from the same level of compression as "native" fields, for lack of a better term. This can potentially lead to memory and performance pressure.
Since calculated columns are only recalculated at model refresh time, there's no reason for them not to be calculated at the source or in ETL.
If you handle all your calculated fields and such in Power Query, you'll help to avoid this sort of situation.
- 10 years ago
Several questions here.
Year + Week slicer
Several options.
You could use a YearWeek display field, e.g. "2016 W02", allowing just a single slicer to be selected. Also much less opportunity for confusion on labels. Some people don't like this, though; that's fine.
You could create a flag field (use PowerQuery Date.IsIn* functions) that is True for the current week of the current year, then just set your filters to 'True' for that report sheet or individual visualization. Since you're likely refreshing your model regularly, this will be up to date.
Hard code current week filter
See the second paragraph in the previous section.
SAMEPERIODLASTYEAR() will work just fine with the filter context set by the CurrentWeekFlag field. No need to make a half dozen versions of every measure.
Cut off past today's date
Use a flag similar to above for YTD. Again, it plays well with other filters and the measures as defined.
Negative Reviews =
CALCULATE(
COUNTA( Dim_Service[Moves_ID] )
,Dim_Service[Positive/Negative] = "N"
)
Negative Reviews YTD =
TOTALYTD( [Negative Reviews], Dim_Date_Service[DateKey] )
Negative Reviews YTD Prior =
CALCULATE(
[Negative Reviews YTD]
,SAMEPERIODLASTYEAR( Dim_Date_Service[DateKey] )
)You can then set your filters based on current year only and the measure will give you last year's equivalent.
Let us know if you run into trouble.
Thank you very much for your well outlined solution! This was also a good lesson on how to use these powerful functions correctly.
To get my desired output, I have to have slicer set to Current Year, and also a seperate slicer set to the Current Week. I would like to avoid having to use the 'Week' slicer.
Side question: Is there a way to hard code the formula to show me the count for this current week in 2016, and then a seperate measure to show me the count for this current week in 2015(prior year)? Currently, the Prior Year measure shows me the count for the entire year, not the count for this period last year. Could this be accomplished with DateAdd?
Perhaps something like this:
TEST Negative Service Breaks = CALCULATE(COUNTA(Dim_Service[MOVES_ID]), Dim_Service[Positive/Negative] = "N", DATEADD(Dim_Date_Service[DateKey], -7,DAY))
^^with the above code, the output is off.
Count of Moves_ID is the correct output.
- greggyb10 years agoResident Rockstar
Several questions here.
Year + Week slicer
Several options.
You could use a YearWeek display field, e.g. "2016 W02", allowing just a single slicer to be selected. Also much less opportunity for confusion on labels. Some people don't like this, though; that's fine.
You could create a flag field (use PowerQuery Date.IsIn* functions) that is True for the current week of the current year, then just set your filters to 'True' for that report sheet or individual visualization. Since you're likely refreshing your model regularly, this will be up to date.
Hard code current week filter
See the second paragraph in the previous section.
SAMEPERIODLASTYEAR() will work just fine with the filter context set by the CurrentWeekFlag field. No need to make a half dozen versions of every measure.
Cut off past today's date
Use a flag similar to above for YTD. Again, it plays well with other filters and the measures as defined.
- cwayne75810 years agoHelper IV
Boom! That's huge. Exactly what I was trying to do. Thank you so much!
Final questions (for today): Is there a way to set a custom parameter for Date.IsIn* functions? Can I set it to last 8 weeks (for example). **I know that may be tricky since we are only in week 2 of new year.
Are there any online resources you recommend for better familiarizing myself with M/PowerQuery?
Thank you again for the advice!
- greggyb10 years agoResident Rockstar
Chris Webb has the best material on Power Query I've seen, though I've not searched much. It's largely a clone of F# with a lot of data munging libraries included, and I'm quite comfortable with functional languages in general (though not terribly familiar with F#), so I find myself satisfied with the formula reference.
No built-ins for "rolling X periods". Here's what I'd do - create a query that has unique combinations of, e.g. week and year, so you'd have 52 or 53 rows per year. Then sort ascending on week, then year, and add an index. You now have a unique key that represents any given week. You can then merge (Power Query's name for join) that week index into the date table. Now you can do a lookup for the [WeekIndex] of today, and set a flag if [WeekIndex] is within 8 of today.
This sort of index makes arbitrary date arithmetic very easy.
I'll put something together around that later if you need some help.
**Edit**: This Channel 9 video is pretty good if your comfortable with a fast paced intro, and have minimal experience with another programming language (especially a primarily functional one)..