In my previous blog post I discussed how the time intelligence function CLOSINGBALANCEMONTH worked great, except when it didn’t. If you remember, the problem was the function CLOSINGBALANCEMONTH could not handle situations where the data had gaps, or blanks on specific dates.
If you missed the previous blog post, you can find it here:
In this post, I want to build a measure that returns the closing price for the date in the current context. My initial attempt at this measure is going to suffer from the same issue we faced when working with the CLOSINGBALANCEMONTH function in the last blog. Let’s start by using CALCULATE and LASTDATE.
Working with LASTDATE
Here is your MSDN definition of LASTDATE: “returns the last date in the current context for the specified column of dates”.
This function is great because it works in the current context so it makes the measures you author in DAX very dynamic. For example:
- If the current context is month, LASTDATE returns the last day of the month.
- If the current context is Quarter, LASTDATE returns the last day of the quarter.
- If the current context is day, the day in the current context is returned.
This means that the LASTDATE function automatically works for each level in your date hierarchy, this is why we like working with DAX, because of this type of functionality.
Let’s take a look at a simple example of LASTDATE:
This simple calculated measures returns the following:
As you can see in this screenshot, LASTDATE is returning the last date of the current context, in this visual we have the month and the year.
Next, I will create a new measure that returns the Closing Price of the current time period. The following measure returns the Closing Price of the stock for the last day of the month:
If we take a look at the results in our table visual, we will see that our measure is returning blanks for certain months. The reason this is occurring is because the stock market isn’t open every day of the year, therefore, if there is no closing price for the last day of the month then a blank value is returned.
LASTNONBLANK function in DAX
I discussed the LASTNONBLANK function in my previous blog post, so I won’t get too detailed here but here is the definition and syntax from MSDN:
Definition: Returns the last value in the column, filtered by the current context, where the expression is not blank.
Syntax: LASTNONBLANK(<column>, <expression>)
LASTNONBLANK will return the last date in the current context that wasn’t blank, that is the perfect function for this scenario.
Let’s take a look at the results of LASTNONBLANK compared to LASTDATE. In the highlighted sections below, notice that for each area where the close price is blank the results of the LASTDATE function and LASTNONBLANK function differ. As previously discussed, the stock market was closed on the last date of the month and therefore the close price does not return a value.
Now it’s time to modify the Close Price measure so that it returns the last close price for the current context:
Here are the final results:
Thanks for reading, enjoy!
Thank you for that great information
Thank you for this great article but it doesn’t work until I used All() like below
last order id per month = VAR _D = LASTNONBLANK(PARALLELPERIOD(Orders[OrderDate],0,MONTH),max(Orders[OrderID])) return
CALCULATE(max(Orders[OrderID]),FILTER(all(Orders),Orders[OrderDate] = _D))
Any explanation?
Hey Ahmed, please go back and look at the previous blog in this series, It explains how to solve this exact scenario.
https://mitchellpearson.com/2018/08/26/semi-additive-measures-in-dax-and-closingbalancemonth/
Also, I noticed you are filtering your ‘Orders’ table. Do you have a designated date table in your data model? If not I would also recommend having a date table, this will help a lot! 🙂 Best Regards.