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

标签 sql ssas mdx olap

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

源数据在任何一天都有相同业务记录的多个版本。时间维度的粒度是 DATE,而不是秒和毫秒。

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

到目前为止我看到的选项属于以下两类之一:

  • 产生精确到秒的时间维度。这会导致时间维度非常大且效率低下。

或者

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

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

数据的自然层次结构是:

  1. 业务 key
  2. 记录时间戳(链接到“时间”维度)
  3. 代理键

最佳答案

不,您绝对无法创建没有时间维度的 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)

非常简单的脚本,创建一个暗淡的表和一个事实表。这是一个简单的选择,在我认为你想要的结果之后,因此 3 和 20 将是​​基于维度 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

关于sql - 非时间维度中最后一个子级的计算成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8120954/

相关文章:

olap - MDXWhere 子句中的 except 函数

sql - 当进一步使用 CROSS APPLY 时,我可以在第一个 SELECT 中使用 GROUP BY 吗?

performance - MDX选择日期维度消耗大量内存

deployment - 跨多个环境部署时的 SSAS 连接字符串?

sql-server - 更改 Excel 中的默认数据库连接

regex - 用于从 MDX 查询中提取元素的正则表达式

Mysql日期功能不工作少于

mysql - 将日期时间除以日期

java - PostgreSQL & JDBC 使用 `setArray` 设置整数数组抛出异常 "cannot cast type integer[] to integer"

sql-server - mdx 规范?