Announcements
Former Employee

## The As-Of Table

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') as Month,

Then add the following lines at the end of the script:

// ======== Create a list of distinct Months ========
tmpAsOfCalendar:
Resident [Master Calendar] ;

// ======== Cartesian product with itself ========
Join (tmpAsOfCalendar)
Resident tmpAsOfCalendar ;

[As-Of Calendar]:
AsOfMonth,
Round((AsOfMonth-Month)*12/365.2425) as MonthDiff,
Year(AsOfMonth)-Year(Month) as YearDiff
Resident tmpAsOfCalendar
Where AsOfMonth >= Month;

Drop Table tmpAsOfCalendar;

Once this table has been created, you can use the AsOfMonth as dimension in charts where you want rolling averages and accumulations.

If you as measure use

Sum({\$<YearDiff={0}>} Sales)

you will get a yearly accumulation – year-to-date up until the day of the script run.

Sum({\$<MonthDiff={"<6"}>} Sales) / Count(distinct {\$<MonthDiff={"<6"}>} Month)

you will get a 6-month rolling average:

And finally, if you use

Sum({\$<MonthDiff={0}>} Sales)

You will get the real, non-accumulated numbers.

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.

If(MonthDiff=0,1,0) as IsSameMonth,
If(YearDiff=0,1,0) as IsSameYear,
If(MonthDiff<6,1,0) as IsRolling6,

Summary: The As-Of table is a good way to calculate rolling averages and accumulations.

HIC

Further reading related to this topic:

The Above Function

Accumulations

Calculating rolling n-period totals, averages or other aggregations

Tags (5)
Contributor II

Hello,

I have seen AsOf tables which are joined directly to the fact table i.e. Calendar->AsOfCalendar->Fact Table and not like in your post AsOfCalendar->Calendar->Fact. Is the result any difference between joining like this?

/M

391 Views
Partner - Contributor

Hello, thank you for the post, it was very helpful.

I have a question:

how could I add the "Quarterdiff" flag?

I would like to aggregate only the 3 months of the selected quarter.

cheers!

345 Views
Contributor II

Hi

How do you get rolling 6 months when you have an As-Of table based on dates and you whant it to roll on the accumulating values and not start over when there is a new year?

Br M

287 Views
Contributor

Hi all,

Similarly, how to do for Asofweeks calendar.

134 Views
Subscribe by Topic