在IcCube中有一个时间向导,可以选择按范围索引。然后,我可以将此维度链接到具有开始字段和结束字段的事实表。
但不幸的是我有一个只有开始日期的事实表,我想以这种方式链接它们,条目有效,直到我有另一个具有相同键的条目。这是可能的,还是我必须在每个条目中添加结束日期?
答案 0 :(得分:2)
如果我理解正确,你就会有一个带有以下结构的事实表
Dim1, DimTime, Amount
1 , 1 Feb 2014, 2.4
2 , 8 Feb 2014, 1.4
3 , 3 Feb 2014, 3.4
你想绑定[2月3日,2月3日]的第一行,[2月3日,2月8日]的第三行,依此类推。
如果是这种情况,就没有简单的方法。理想情况下,您可以计算数据源中的to)部分,或者可以使用icCube的ETL层来解决它(带缓存的Javascript)。注意,对于非常大的表,最后一个不是一个好方法。
如果您可以按时间列排序,则无需缓存整个表格即可轻松实现算法。
您可以使用link所述的Javascript视图在此here中找到架构示例。
希望有所帮助
答案 1 :(得分:0)
感谢您的架构。不幸的是我无法在IcCube中打开架构。它说,架构是错误的。但看看代码有很多帮助。我稍微更改了一下javascript,因为这是日期问题,我添加了一个缓慢变化的维度的可能性:
记忆中:
Dim1, DimTime, Amount
1,1 Feb 2014,2.4
1,3 Feb 2014,1.4
1,11 Feb 2014,1.4
2,4 Feb 2014,2.4
2,8 Feb 2014,1.4
3,3 Feb 2014,3.4
3,7 Feb 2014,6.4
初始代码:
var SCD = "Dim1";
var formerRow = null;
var currentRow = null;
var rowNumber = 0;
var jDateType = Java.type( "org.joda.time.LocalDate" );
var jDateNow = new jDateType();
行处理行:
currentRow = copy();
set( currentRow, "TO", jDateNow );
if ( formerRow === null) {
// first Line, copy the current row
formerRow = copy();
currentRow = null;
} else if (get(currentRow,SCD) != get(formerRow,SCD)) {
set( formerRow, "TO", jDateNow );
fire(formerRow, rowNumber++);
formerRow = currentRow;
currentRow = null;
} else {
// second Line
set( formerRow, "TO", get(currentRow,"DimTime").plusDays(-1) );
fire(formerRow, rowNumber++);
formerRow = currentRow;
currentRow = null;
}
完成代码:
fire( formerRow, rowNumber++ );