软件开发工程师
· IBM
【贝克汉姆教程】 2.3.2 决定因素(Determinants) 字数 2870 阅读 5717 评论 27 赞 25
2.3.2、决定因素(Determinants) 决定因素是什么?为什么要使用决定因素?这个问题一直以来令很多cognos人员迷惑。其实它仅仅是Framework Manager里的一个排除重复记录的概念,理解它的方法莫过于用通俗易懂的实例去理解。相信对determinants还有疑惑的人看完本章教程之后会有新体会。 2.3.2.1、Determinants定义 Determinants通过表达查询主题中的子集或数据组来反映粒度,并用于确保此重复数据的正确聚合运算。 决定因素与数据源中键和索引的概念联系最密切,并且是在数据源中特有的键和索引信息的基础上导入的。因此建议建模者检查导入的决定因素,并修改这些决定因素或创建其他决定因素(如有必要)。它没有层次结构的概念,尽管它们被指定的顺序决定它们估算的顺序。 2.3.2.2、Determinants的用途 建模设计时,在很有限的情况下才需要设定determinants,主要用于以下三个方面: A、对于重复的键或属性,需要进行计数或执行其他聚合函数。 下面用一个简单的sample阐述: 维表Time_Dimension(Current_Year,month_key,days_in_month,day_key) 根据数据记录可得知其中'Days_in_month' 是重复的,该月的每一天显示一次。如1月份有31天,则days_in_month会重复31次。若你想在报表中引用它,而又不想看到下(图2.3.2.20)中左边ListTable2的效果。若只令其显示一次,如下图的左边ListTable1的效果,就须对该维表设置决定因素。在报表中展示时,系统自动取唯一值XMIN(Days_in_month for Month_Key),还有个group by。 (图2.3.2.20-ListTable比较) 上面2个效果所生成的CognosSQL语句如下:
ListTable 2 产生的 cognos
sql
ListTable 1 产生的 cognos
sql
select
T1.current_year as current_year,
T1.month_key as month_key,
T1.days_in_month as days_in_month
from
great_outdoors_sales..gosales.time_dimension T1
select
T1.current_year as current_year,
T1.month_key as month_key,
XMIN(T1.days_in_month for T1.current_year,T1.month_key) as
days_in_month
from
great_outdoors_sales..gosales.time_dimension T1
group by
T1.current_year,T1.month_key
将上图表1的效果转化为普通的SQL就好理解得多了: Select current_year,month_key,min(days_in_month) from
Time_dimension
Group
by current_year,month_key 以上是一个比较简单的理解实例,那么在实际应用中,如事实表、维表,也经常使用了决定个因素。一般来说,只要你的数据表中设置了PK(主键),当被导入FM之后系统自动根据PK设置了决定因素,确保聚合运算避免double count,如下图: (图2.3.2.21 事实表决定因素) 因此当在报表中引用Attributes的内容时,都将会采用XMIN取唯一值避免聚合重复计算。对于没有设置PK的数据表,在导入FM之后须手工设置决定因素。 B、用作维度的查询主题具有多级粒度,并将基于不同的键集合联接至资料数据。 这种情况的只用于’多资料、多粒度’ 查询(一个维表中的多个键和不同的事实表进行关联,后面的教程里会详细讲解 ),如Time_dimension(year,month_key,day_key)中day_key关联至 Sales_Fact、month_key关联至Sales_target(月份是该事实表的日期最小粒度,即销售部门只制定了月销售目标)。 (图2.3.2.22 多粒度、多资料查询) 出现多粒度层的连接,MONTH_KEY和DAY_KEY 。这样当在两层进行多事实查询时,会出现问题,而你则需要防止重复计数。若未设置决定因素报表查询的结果如下: (图2.3.2.23 重复关联聚合) 图中事实表Sales_Target的日期最小粒度是month而不是day,而month在Time_Dimension表中是重复的。根据上图中计算,2000年1月份会有31个"1月" 与Sales_Target关联、2000年2月份有29个 "2月" 月与Sales_Target关联。依次类推,就会得到上面错误的结果。 如何避免月份的sales_target不重复计数?首先要让日期维表给'月' 排重,接下来我们按照下图中的方法设置决定个因素: 一般而言, 重复的健或属性需要计数或聚合运算 、 多资料多粒度查询 或 BLOB查询 时才使用determinants。这里建议根据实际需求去使用它,因为无论是使用relationships或determinants都有一定的副作用。下一篇章继续讲解 '2.3.3 设置Relationships ' 如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞25
分享
添加新评论27 条评论
2013-08-19 11:30
2012-09-11 21:31
如果为了提高查询速度,可以ETL处理(汇总)fact的结果存储在一个report table里
2012-06-15 07:51
2012-06-14 22:48
如果为了提高查询速度,可以ETL处理(汇总)fact的结果存储在一个report table里
2012-06-14 16:40
2012-06-14 14:18
2012-06-14 10:43
2012-03-30 17:29
2012-03-13 10:46
2012-02-08 17:12
2011-12-26 09:32
2011-06-15 10:01
2011-06-08 18:28
2011-05-10 22:24
我们衷心期望老贝今后有机会详细实例讲解 7类 55 个 Cognos 维度函数 ( Dimensional Functions).
2011-05-10 22:11
我们衷心期望老贝今后有机会详细实例讲解 7 类 57 个 Cognos 维度函数 ( Dimensional Functions).
另外, Determinants 译成确定因子比较好。似乎更准确。
2011-05-10 13:53
都是来自同一个维表,当对这个维表设置决定因素时,会有一个顺序,当月在周上面时,如果周跨月,这一周的数据将会翻倍,如果周在月上面,这一月的数据将会乘以几倍,具体几倍决定于这一月有几周。不知道有什么方法可以解决。
2011-05-10 12:33
2011-05-07 16:00
2011-05-06 13:26
2011-05-06 12:15
2011-05-06 12:06
2011-05-04 13:30
2011-04-28 16:05
2011-04-26 13:25
2011-04-26 13:08
2011-04-26 11:29
2011-04-26 11:08