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

Mar*_*ark 9 sql olap ssas mdx

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

源数据在任何给定日期都有相同业务记录的许多版本.时间维度的粒度为DATE,而不是秒和毫秒.

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

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

  • 产生一个低至秒的时间维度.这将导致非常大且低效的时间维度.

要么

  • 隐藏度量并使用计算的度量替换它们,这些度量根据主键查找任何给定日期的最后一个值.这很麻烦且效率较低.

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

数据的自然层次结构是:

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

Die*_*ego 5

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

在此输入图像描述

您可以做的是在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)
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

构建非常简单,只需右键单击您的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 
Run Code Online (Sandbox Code Playgroud)

创建逻辑主键并将其链接到维度表: 在此输入图像描述

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

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

在此输入图像描述

结果:

在此输入图像描述