Last week I wrote about how the Above() function can be used for calculating rolling averages and other accumulations. There is however also an alternative method for doing the same thing:
The As-Of table.
When you use the Above() function, you fetch a number from other rows in a chart or Aggr() table. The As-Of table is slightly different in this respect: It is not a transient table created by an object or an expression – instead it is a real table in the data model.
The idea is to create a secondary month field – the AsOfMonth - that links to multiple real months.
In the example above, you can see that ‘2015 Oct’ links to several preceding months, and each Month in turn links to several rows in a fact table. This means that a specific transaction will be linked to several AsOfMonths.
In the data model, the As-Of table should appear as a separate calendar table that links to the existing primary calendar table:
One way to create this table is the following:
First, make sure that you in your master calendar have a field “Month” that is defined as the first date of the month, e.g.
Date(MonthStart(Date),'YYYY MMM') asMonth,
Then add the following lines at the end of the script:
// ======== Create a list of distinct Months ======== tmpAsOfCalendar: LoaddistinctMonth Resident [Master Calendar] ;
I have made the Set Analysis expressions based on two fields: YearDiff and MonthDiff. However, for clarity it could be a good idea to add flags in the As-Of table, so that the Set Analysis expressions become even simpler, e.g.
First create your fiscal calendar. Then create the As-Of table based on a field from your new fiscal calendar. If you look at the example table then you'd use the RMonth field for generating the As-Of table.
I have one situation like , when i select any year the, all previous years yearMonth should display , and if i select any year and month then it should show all previous year months.
What changes we need to perform if i want to keep As of "Date" rather than a "Month'? Like all previous data from the date selected for example: 05-Oct-2015 OR 07-Oct-2015.
If you use dates instead of months, the As-Of table will be much larger. So don't do it for very large time spans. You can use the following as template (if you already have a master calendar with dates):
// ======== Create a list of Dates ======== tmpAsOfCalendar: LoaddistinctDate Resident[Master Calendar] ;
Thank you for the response, But what is the best solution to generate As of Date reports for large data. As using set expression i am unable to select individual dimensions if they don't have transaction on the selected date in a filter and most of my reports are based on "As of Date".
You should use something along the lines the script in the answer above.
All I am saying is that you should think twice about the number of dates you use. For instance, if you have one year of data, and one year of as-of dates, you will have ~ 70000 records in the as-of table. Which could be perfectly acceptable.
But if you have four years of data and four years of as-of dates, you will 16 times as many combinations. You will get an as-of table with over 1 million records, and this will most likely affect performance.