非时间维度中最后一个孩子的计算成员?

时间:2011-11-14 11:33:47

标签: sql ssas mdx olap

在SSAS多维数据集中,如何为非时间维度创建聚合为LastChild的度量?

源数据在任何指定日期都有许多同一商业记录的版本。时间维度具有DATE的粒度,而不是秒和&毫秒。

事实记录具有时间戳和增量(标识)主键。实际上,我想要的是将度量计算为给定日期所有编辑的最后一个值。

到目前为止,我看到的选项分为两类:

  • 生成一个时间维度,下降到秒。这将导致非常大且效率低的时间维度。

OR

  • 隐藏度量并将其替换为计算度量,这些度量根据主键查找任何给定日期的最后一个值。这很麻烦,效率也很低。

是否有解决这个问题的最佳点或替代技术?

数据的自然层次结构是:

  1. 商业钥匙
  2. 记录时间戳(指向TIME维度的链接)
  3. 代理钥匙

1 个答案:

答案 0 :(得分:5)

不,你绝对不能创建没有时间维度的latChild属性:

enter image description here

您可以在DSV上创建一个查询,为您提供最后一个子值,并使用它来创建一个度量值组。例如:

脚本:

create table dim(
id int not null primary key,
name varchar(50))
insert into dim values (1,'one'),(2,'two')

create table fact(
id int not null primary key,
dimId int not null,
value numeric (12,3),
constraint fk_fact_dim foreign key(dimId) references dim(id))

insert into fact values (1,1,5)
insert into fact values (2,1,3)

insert into fact values (3,2,10)
insert into fact values (4,2,20)

非常简单的脚本,可以创建一个dim和一个事实表。这是一个简单的选择,在我认为你想要的结果之后,所以3和20将是基于Dimension ID的最后一个值:

enter image description here

构建非常简单,只需右键单击您的DSV并添加新的命名查询并通知查询创建您的最后一个值。在我的情况下是:

select dimId, 
(select top 1 value from fact where dimId=F.dimId order by id desc) as lastValue
from fact F
group by dimId 

创建逻辑主键并将其链接到维度表: enter image description here

在您的多维数据集上,右键单击任何空白区域,选择“显示所有表格”并添加新表格。

在您的多维数据集上创建一个新度量为“无聚合”,因为您已经汇总了查询:

enter image description here

结果:

enter image description here