Skip to main content

Slowly changing dimensions

Slowly changing dimensions in MSTR

Slowly changing dimensions (SCDs) are a common characteristic in many business intelligence environments. Usually, dimensional hierarchies are presented as independent of time. For example, a company may annually reorganize their sales organization or recast their product hierarchy for each retail season. “Slowly” typically means after several months or even years. Indeed, if dimensional relationships change more frequently, it may be better to model separate dimensions.
SCDs are well documented in the data warehousing literature. Ralph Kimball has been particularly influential in describing dimensional modeling techniques for SCDs (see The Data Warehouse Toolkit, for instance). Kimball has further coined different distinctions among ways to handle SCDs in a dimensional model. For example, a Type I SCD presents only the current view of a dimensional relationship, a Type II SCD preserves the history of a dimensional relationship, and so forth.
The discussion below is based on an example sales organization that changes slowly in time as the territories are reorganized; for example, sales representatives switch districts in time.

As-is vs. as-was analysis

One of the capabilities available with slowly changing dimensions is the ability to perform either “as-is” analysis or “as-was” analysis:
“As-is” analysis presents a current view of the slowly changing relationships. For example, you can display sales by District according to the way Districts are organized today.
“As-was” analysis presents a historical view of the slowly changing relationships. For example, you can display sales by District according to the way Districts were organized at the time the sales transactions occurred.
The techniques described here provide the flexibility to perform either type of analysis. They also provide you an easy way to specify which type of analysis you would like to perform.

Example 1: Compound key with Effective Date and End Date

One way to physically store an SCD is to employ Effective Date and End Date columns that capture the period of time during which each element relationship existed. In the example below, Sales Rep Jones moved from District 37 to District 39 on 1/1/2004, and Kelly moved from District 38 to 39 on 7/1/2004.
For information on compound keys, please refer to Lookup tables: Attribute storage.
LU_SALES_REP
Sales_Rep_ID
Sales_Rep_Name
District_ID
Eff_Dt
End_Dt
1
Jones
37
1/1/1900
12/31/2003
2
Smith
37
1/1/1900
12/31/2099
3
Kelly
38
1/1/1900
6/30/2004
4
Madison
38
1/1/1900
12/31/2099
1
Jones
39
1/1/2004
12/31/2099
3
Kelly
39
7/1/2004
12/31/2099
When using this type of dimensional lookup table, the fact table must include a date field, such as a transaction date.
FACT_TABLE
Sales_Rep_ID
Trans_Dt
Sales
1
9/1/2003
100
2
9/10/2003
200
3
9/15/2003
150
1
3/1/2004
200
2
3/10/2004
250
3
3/15/2004
300
2
9/5/2004
125
3
9/15/2004
275
4
9/20/2004
150

To specify the MicroStrategy schema

1Create a logical view to represent just the current District-Sales Rep relationships.
LVW_CURRENT_ORG
select Sales_Rep_ID, District_ID
from LU_SALES_REP
where End_Dt = '12/31/2099'
2Create another logical view that performs the “as-was” join between the lookup table and fact table, resulting in a fact view at the District level.
The resulting view is an “as-was” or historical view, which captures the Sales Rep-District relationships that existed at the time the transactions occurred.
LVW_HIST_DISTRICT_SALES
select District_ID, Trans_Dt, sum(sales)
sales 
from LU_SALES_REP L
join FACT_TABLE F
on(L.Sales_Rep_ID = F.Sales_Rep_ID)
where F.Trans_Dt between L.Eff_Dt and
L.End_Dt
group by District_ID, Trans_Dt
3Create a table alias LU_CURRENT_DISTRICT for LU_DISTRICT.
4Define the following attributes:
Sales Rep:
@ID = sales_rep_id; @Desc = sales_rep_name
Tables: LU_SALES_REP (lookup), LVW_CURRENT_ORG, FACT_TABLE
Current District:
@ID = district_id; @Desc = district_name
Tables: LU_CURRENT_DISTRICT (lookup), LVW_CURRENT_ORG
Child: Sales Rep
Historical District:
@ID = district_id; @Desc = district_name
Tables: LU_DISTRICT (lookup), LU_SALES_REP, LVW_HIST_DISTRICT_SALES
Child: Sales Rep
Date:
@ID = date_id, trans_dt
Tables: LU_TIME (lookup) , FACT_TABLE, LVW_HIST_DISTRICT_SALES
Month:
@ID = MONTH_ID
Tables: LU_TIME (lookup)
5Define the Sales fact:
Expression: sales
Tables: FACT_TABLE, LVW_HIST_DISTRICT_SALES
6Define the metric as required:
Sales: SUM(sales)
The result of this is a logical schema that looks like the following:

As-was analysis

Specify the “as-was” analysis by using the Historical District attribute on reports:
Report definition: Historical District, Month, Sales
Resulting SQL
Select a11.District_ID District_ID,
max(a13.District_Name) District_Name,
a12.Month_ID Month_ID,
sum(a11.SALES) WJXBFS1
From (select District_ID, Trans_dt,sum(sales) sales
from LU_SALES_REP L
join FACT_TABLE F
on (L.Sales_rep_ID = F.Sales_rep_ID)
where F.trans_dt between L.EFF_DT and
L.END_DT
group by District_ID, Trans_dt)
a11
join LU_TIME a12
on (a11.Trans_dt = a12.Date_ID)
join LU_DISTRICT a13
on (a11.District_ID = a13.District_ID)
group by a11.Distrcit_ID,
a12.Month_ID
Report results

As-is analysis

Specify the “as-is” analysis by using the Current District attribute on reports:
Report definition: Current District, Month, Sales
Resulting SQL
select a12.District_ID District_ID,
max (a14.District_Name) District_Name,
a13.Month_ID Month_ID,
sum(a11.SALES) WJXBFS1
from FACT_TABLE a11
join (select Sales_rep_ID, District_ID
from LU_SALES_REP
where END_DT = '12/31/2099')a12
on (a11.Sales_Rep_ID =
a12.Sales_Rep_ID)
join LU_TIME a13
on (a11.Trans_dt = a13.Date_ID)
join LU_DISTRICT a14
on (a12.District_ID = a14.District_ID)
group by a12.District_ID,
a13.Month_ID
Report result

Example 2: New surrogate key for each changing element

A more flexible way to physically store a SCD is to employ surrogate keys and introduce new rows in the dimension table whenever a dimensional relationship changes. Another common characteristic is to include an indicator field that identifies the current relationship records. An example set of records is shown below.
LU_SALES_REP
Sales_Rep_CD
Sales_Rep_ID
Sales_Rep_Name
District_ID
Current_Flag
1
1
Jones
37
0
2
2
Smith
37
1
3
3
Kelly
38
0
4
4
Madison
38
1
5
1
Jones
39
1
6
3
Kelly
39
1
When using this type of dimensional lookup table, the fact table must also include the surrogate key. A transaction date field may or may not exist.
FACT_TABLE
Sale-Rep_CD
Sale
1
100
2
200
3
150
5
200
2
250
3
300
2
125
6
275
4
150

Specifying the MicroStrategy schema

1Create a logical view to represent just the current District-Sales Rep relationship.
LVW_CURRENT_ORG
select Sales_rep_ID, District_ID
from LU_SALES_REP
where Current_flag = 1
2Create a table alias LU_CURRENT_DISTRICT for LU_DISTRICT.
3Define the following attributes:
Sales Rep Surrogate:
@ID = sales_rep_cd
Tables: LU_SALES_REP (lookup), FACT_TABLE
Sales Rep:
@ID = sales_rep_id; @Desc = sales_rep_name
Tables: LU_SALES_REP (lookup), LVW_CURRENT_ORG
Child: Sales Rep Surrogate
Current District:
@ID = district_id; @Desc = district_name
Tables: LU_CURRENT_DISTRICT (lookup), LVW_CURRENT_ORG
Child: Sales Rep
Historical District:
@ID = district_id; @Desc = district_name
Tables: LU_DISTRICT (lookup), LU_SALES_REP
Child: Sales Rep
Date:
@ID = date_id, trans_dt
Tables: LU_TIME (lookup), FACT_TABLE
Month:
@ID = MONTH_ID
Tables: LU_TIME (lookup)
Child: Date
4Define the Sales fact:
Expression: sales
Tables: FACT_TABLE, LVW_HIST_DISTRICT_SALES
5Define the metric as required:
Sales: SUM(sales)
The result is a logical schema as follows:

As-was analysis

Specify the “as-was” analysis by using the Historical District attribute on reports:
Report definition: Historical District, Month, Sales
Resulting SQL
select a12.District_ID District_ID,
max(a14.Distrcit_Name) Distrcit_Name,
a13.Month_ID Month_ID,
sum(a11.SALES) WJXBFS1
from FACT_TABLE a11
join LU_SALES_REP a12
on (a11.Sales_Rep_CD =
a12.Sales_Rep_CD)
join LU_TIME a13
on (a11.Trans_dt = a13.Date_ID)
join LU_DISTRICT a14
on (a12.District_ID =
a14.District_ID)
group by a12.District_ID, 
a13.Month_ID
Report results

As-is analysis

Specify the “as-is” analysis by using the Current District attribute on reports:
Report definition: Current District, Month, Sales
Resulting SQL:
select a13.District_ID District_ID,
max(a15.Distrcit_Name) District_Name,
a14.Month_ID Month_ID,
sum(a11.SALES) WJXBFS1
from FACT_TABLE a11
join LU_SALES_REP a12
on (a11.Sales_Rep_CD =
a12.Sales_Rep_CD)
join (select Sales_rep_ID, District_ID
from LU_SALES_REP
where current_flag = 1) 
a13
on (a12.Sales_Rep_ID =
a13.Sales_Rep_ID)
join LU_TIME a14
on (a11.Trans_dt = a14.Date_ID)
join LU_DISTRICT a15
on (a13.District_ID =
a15.District_ID)
group by a13.District_ID,
a14.Month_ID
Report result

Comments

Popular posts from this blog

Case functions Microstrategy

Ca se functions Microstrategy Case functions return specified data in a SQL query based on the evaluation of user-defined conditions. In general, a user specifies a list of conditions and corresponding return values. Case This function evaluates multiple expressions until a condition is determined to be true, then returns a corresponding value. If all conditions are false, a default value is returned.  Case  can be used for categorizing data based on multiple conditions. This is a single-value function. Syntax Case ( Condition1 ,  ReturnValue1 ,  Condition2 , ReturnValue2 ,...,  DefaultValue ) Example Case(([Total Revenue] < 300000), 0, ([Total Revenue] < 600000), 1, 2) sum(Case (Day@DESC in (“Sat”,”Sun”), Sales, 0) {~+} Sum(Case(Category@DESC In("Books","Electronics"),Revenue,0)){~+} CaseV (case vector) CaseV  evaluates a single metric and returns different values according to the results. It can be used to perfo...

Apply or Pass-through functions in Microstrategy

Ap ply (Pass-Through) functions MSTR Apply functions provide access to functions or syntactic constructs that are not standard in MicroStrategy but are provided by various RDBMS systems.. Syntax common to Apply functions Apply Function Name   ("expression with placeholders", Arg1, Arg2, Arg3, …ArgN) where: Apply Function Name  – is a generic name used for the predefined pass-through functions described above expression with placeholders  – is the string describing the actual expression or syntax that the engine uses while generating the SQL and which is sent to the RDBMS. The placeholders are represented by #0, #1, and so on. "#" is a reserved character for MicroStrategy. Arg  – is an argument that replaces the parameter markers in the pattern. Arg1 replaces #0, Arg2 replaces #1, and so on. There are   five  pre-defined Apply functions to replace regular, predefined functions of the same type. For more details, cli...

MicroStrategy URL API Parameters

MicroStrategy URL Structure The following table summarizes the root URL structure used for every request to MicroStrategy Web. Environment Main Application URL Administration URL J2EE http://webserver/MicroStrategy/servlet/mstrWeb http://webserver/MicroStrategy/servlet/mstrWebAdmin .NET http://webserver/MicroStrategy/asp/Main.aspx http://webserver/MicroStrategy/asp/Admin.aspx Every request sent to MicroStrategy Web calls a central controller. Parameters are appended to  Main.aspx  or  mstrWeb  (in a .NET and J2EE environment, respectively) to indicate to the controller how the request should be internally forwarded and handled. The following examples show a URL for accessing a MicroStrategy folder when the user does not have an existing session. The URL contains not only the parameters needed to connect to MicroStrategy Web, but also the parameters needed to log on and create a session. J2EE environment: <a href="http:...

Prompt-in-prompt(Nested Prompts) in Microstrategy

Prompt-in-prompt(Nested Prompts) in  Microstrategy Nested prompts allows you to create one prompt based on the other and other bases on another, nested prompts allows us to prompt the highest level(Like year) to middle level(like Quarter, then to the low level(like Month). Here you can see how to  create a 3-level deep nested prompt that will prompt the user to select a year, then a quarter within that year, then a month within that quarter. Prompt-in-prompt is a feature in which the answer to one prompt is used to define another prompt. This feature is only implemented for element list prompts . The following procedure describes how to achieve this: Create the highest level filter. This is a filter which contains a prompt on an attribute element list. Create a filter on the attribute "Year." Click "prompt on attribute element list" and click "Next" through the rest of the screens to accept the default values. Do not set any additio...

Control the display of null and zero metric values

Show   Control the display of null and zero metric values in a grid report You can determine how to display or hide rows and columns in a grid report that consist only of null or zero metric values. You can have MicroStrategy hide the rows and columns in the following ways: Hide rows and columns that consist only of null metric values Hide rows and columns that consist only of zero metric values Hide rows and columns that consist only of null or zero metric values (default) Once you have defined how MicroStrategy hides null and zero metric values in the grid, you can quickly show or hide the grid using the Hide Nulls/Zeros option in the Data menu, as described below, or by clicking the  Hide Nulls/Zeros  icon  in the Data toolbar. To determine how null and zero metric values are displayed or hidden in a grid report Open the report in Edit mode. From the  Tools  menu, select  Report Options . The Report Options...

Setting up a System Manager workflow to execute on a schedule in MicroStrategy

Setting up a System Manager workflow to execute on a schedule in MicroStrategy In some instances, a MicroStrategy user may want a System Manager workflow to execute on a set schedule or after an event has been triggered. This can be accomplished by creating a simple batch file, and scheduling that batch file to execute with a third-party tool like Microsoft Task Scheduler.   Note : To avoid user permission conflicts, the following steps must be performed with highest privileges.   In the following example, a user would like to execute a workflow that restarts the Intelligence Server every day.   1. The user must first have a valid workflow. This particular workflow is a template that is delivered out-of-the-box with System Manager.     2. Save the workflow in  .smw  format.   3. In a text editor (such as Notepad), enter the command line statement that the task scheduler should execute.       4. Save the file in ...

Use a Visualization to Filter the Data in Another Visualization in a Dossier

Use a Visualization to Filter the Data in Another Visualization Once you add visualizations to a dossier, you can use one visualization to filter or highlight data in another visualization. Define one visualization as the source. Then, select the other visualizations you want to filter or highlight as targets. The target visualizations only display or highlight data that also appears in the source. Your target visualization can be in any chapter or page within your dossier. Open a dossier with two or more visualizations. To enable a visualization to filter or highlight the data in another visualization Open the dossier  you want to modify. Hover over the visualization to use as the source and click  More   in the top right and choose  Select Target . A   icon appears in the upper left corner of the source visualization. The name of the source visualization appears after  Use visualization  at the top of the screen. If the source visualization...

Microstrategy Custom number formatting symbols

Custom number formatting symbols If none of the built-in number formats meet your needs, you can create your own custom format in the Number tab of the Format Cells dialog box. Select  Custom  as the Category and create the format using the number format symbols listed in the table below. Each custom format can have up to four optional sections, one each for: Positive numbers Negative numbers Zeros Text Each section is optional. Separate the sections by semicolons, as shown in the example below: #,###;(#,###);0;"Error: Entry must be numeric" For more examples, see  Custom number formatting examples . To jump to a section of the formatting symbol table, click one of the following: Numeric symbols Character/text symbols Date and time symbols Text color symbols Currency symbols Conditional symbols Numeric symbols For details on how numeric symbols apply to the Big Decimal data type, refer to the  Project Design Guide . ...

Microstrategy URL API hide sections

Microstrategy URL API hide sections Users may want to display MicroStrategy Web 10.1 documents inside an iframe. To prevent users from navigating out of the document, they might want to hide some sections from the page. This is easily done using the &hiddensections URL parameter that can be obtained from the folder browsing page. Navigate to the document. Right click the document > Share >  Embed. Examine the src parameter, which contains the URL to the document. Extract the &hiddensections parameter: &hiddensections=header,path,dockTop,dockLeft,footer

Microstrategy Caches explained

Microstrategy Caches Improving Response Time: Caching A  cache is a result set that is stored on a system to improve response time in future requests.  With caching, users can retrieve results from Intelligence Server rather than re-executing queries against a database. To delete all object caches for a project 1 In Developer, log into a project. You must log in with a user account that has administrative privileges. 2 From the  Administration  menu, point to  Projects , and then select  Project Configuration . The Project Configuration Editor opens. 3 Expand  Caching , expand  Auxiliary Caches , then select  Objects . To delete all configuration object caches for a server 1 Log in to the project source. 2 From the  Administration  menu in Developer, point to  Server , and then select  Purge Server Object Caches . 4 Click  Purge Now . To purge web cache follow the steps in the link ...