贝克汉姆
作者贝克汉姆·2011-04-26 10:49
软件开发工程师·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语句如下:

ListTable2产生的cognos sql


ListTable1产生的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不重复计数?首先要让日期维表给'月'排重,接下来我们按照下图中的方法设置决定个因素:


(图2.3.2.24 set determinants)
  Day在Time_dimension是唯一的,所以将其设置为Uniquely Identified,而Year、Quarter、Month都是重复的,将其设置为Group By以避免重复。于是将会得到如下正确的结果:
 
(图2.3.2.25 正确的查询结果)
  现在报表中,可以同时展现某个月份的实际收入与当月的销售目标:
 
(图2.3.2.26 多粒度、多资料查询结果)
  C、BLOB数据类型在查询主题中。这里不详述,有兴趣的朋友可以研究研究。
  一般而言,重复的健或属性需要计数或聚合运算多资料多粒度查询BLOB查询时才使用determinants。这里建议根据实际需求去使用它,因为无论是使用relationships或determinants都有一定的副作用。下一篇章继续讲解 '2.3.3 设置Relationships'

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

25

添加新评论27 条评论

voyager8000voyager8000BI开发工程师勝佳
2013-08-19 11:30
感謝指導 ^^
xihuazhoujinxihuazhoujin软件开发工程师xihuadaxue
2012-09-11 21:31
贝克汉姆: 没必要给FACT表做决定因素,决定因素仅用于多资料多粒度查询时才使用。
如果为了提高查询速度,可以ETL处理(汇总)fact的结果存储在一个report table里
~~~不论对于我这样的新手还是对于困惑的老手都狠受用~~
characmcharacm软件开发工程师沙信科技
2012-06-15 07:51
小菜鸟谢过老贝啦~解决了我的一大困惑
贝克汉姆贝克汉姆软件开发工程师IBM
2012-06-14 22:48
characm: 像每月的生产计划维表,数据是一月一条,但事实表里的生产数据是天天有很多条,如果要统计每月的计划完成情况的话,是不是能使用决定因素呢?还是像您说的在数据库中新建一
没必要给FACT表做决定因素,决定因素仅用于多资料多粒度查询时才使用。
如果为了提高查询速度,可以ETL处理(汇总)fact的结果存储在一个report table里
characmcharacm软件开发工程师沙信科技
2012-06-14 16:40
像每月的生产计划维表,数据是一月一条,但事实表里的生产数据是天天有很多条,如果要统计每月的计划完成情况的话,是不是能使用决定因素呢?还是像您说的在数据库中新建一张汇总事实表,在ETL中就处理好?麻烦老贝啦~
贝克汉姆贝克汉姆软件开发工程师IBM
2012-06-14 14:18
characm: 能对事实表使用决定因素吗?
理论上可以,但没实际意义,而且影响查询,在ETL时就处理好
characmcharacm软件开发工程师沙信科技
2012-06-14 10:43
能对事实表使用决定因素吗?
dzq_1874dzq_1874其它ibm
2012-03-30 17:29
一个概念一个概念的理解!
yilufengjingyilufengjing软件开发工程师lili
2012-03-13 10:46
讲的真好,好好学习
xiong1998xiong1998软件开发工程师Newegg
2012-02-08 17:12
终于明白Determinants了 以前做都是朦朦胧胧的 基本靠蒙。谢谢

2011-12-26 09:32
很强大
xc7042318xc7042318学生SYSU
2011-06-15 10:01
有个问题不太明白,就是上面那个错误的例子,楼主解释说“图中事实表Sales_Target的日期最小粒度是month而不是day,而month在Time_Dimension表中是重复的。根据上图中计算,2000年1月份会有31个"1月"与Sales_Target关联、2000年2月份有29个"2月"月与Sales_Target关联。依次类推,就会得到上面错误的结果。”这样的话算出来的错误结果应该是每个项的计划统计其实是正确的计划*当月的天数,当时实际算出的好像是全年的计划和,请楼主解释一下,应该是我理解错了~~
drf661drf661软件开发工程师ABC
2011-06-08 18:28
感谢老贝
贝克汉姆贝克汉姆软件开发工程师IBM
2011-05-10 22:24
stillthere: 这论坛需要更多的老贝这样的好人哪!

我们衷心期望老贝今后有机会详细实例讲解 7类 55 个 Cognos 维度函数  ( Dimensional  Functions).
好的,多谢提醒
stilltherestillthere软件开发工程师HP
2011-05-10 22:11
这论坛需要更多的老贝这样的好人哪!

我们衷心期望老贝今后有机会详细实例讲解 7 类 57 个 Cognos 维度函数  ( Dimensional  Functions).  

另外, Determinants 译成确定因子比较好。似乎更准确。
cognoscognos
2011-05-10 13:53
贝克汉姆: 从逻辑上讲,月不能作为周的上级,一般年、周、日 做一个级层次
是的,做两个层次,一个为:年、季、月、日;一个为:年、周、日。
都是来自同一个维表,当对这个维表设置决定因素时,会有一个顺序,当月在周上面时,如果周跨月,这一周的数据将会翻倍,如果周在月上面,这一月的数据将会乘以几倍,具体几倍决定于这一月有几周。不知道有什么方法可以解决。
小牛小牛商业智能工程师自由职业
2011-05-10 12:33
研究一下,呵呵
aqiang_007aqiang_007软件开发工程师longtop
2011-05-07 16:00
我今天就打算研究这个了,学习了,太好了
贝克汉姆贝克汉姆软件开发工程师IBM
2011-05-06 13:26
cognos: 如果是周和月在一起,而周又跨月,这样设置还是会有问题
从逻辑上讲,月不能作为周的上级,一般年、周、日 做一个级层次
dy2216dy2216软件开发工程师上海新致
2011-05-06 12:15
了解了,虽然不常用
cognoscognos
2011-05-06 12:06
如果是周和月在一起,而周又跨月,这样设置还是会有问题

2011-05-04 13:30
很好!希望更新快点!很期待!

2011-04-28 16:05
讲的非常详细,各个点描述的也非常清楚,菜鸟级的我都看懂了,谢谢老贝。
贝克汉姆贝克汉姆软件开发工程师IBM
2011-04-26 13:25
jyang_longtop: 终于等到了,刚刚对这个很疑惑,看完之后感觉廓然开朗。。。十分感谢!
我还担心讲得不够清晰呢, thankyou
jyang_longtopjyang_longtopBI开发工程师东南融通
2011-04-26 13:08
终于等到了,刚刚对这个很疑惑,看完之后感觉廓然开朗。。。十分感谢!
慕名而来慕名而来软件开发工程师中科软
2011-04-26 11:29
终于等来新章节了.拜读中.
heianxianzheheianxianzhe数据挖掘工程师321
2011-04-26 11:08
Determinants这个不是很清楚 小贝这里将的很清楚啊
Ctrl+Enter 发表

作者其他文章

相关问题

相关资料

X社区推广