在IcCube中,有一个具有按范围索引的选项的时间向导。然后,我可以用开始字段和结束字段将这个维度链接到事实表。
但不幸的是,我有一个事实表,只有开始日期,我想以这种方式链接他们,该条目是有效的,直到我有另一个条目与相同的键。这是可能的吗,还是我必须将结束日期添加到每个条目中?
发布于 2016-06-29 04:19:47
如果我理解正确,那么您有一个包含以下结构的事实表
Dim1, DimTime, Amount
1 , 1 Feb 2014, 2.4
2 , 8 Feb 2014, 1.4
3 , 3 Feb 2014, 3.4
您希望绑定[2月1日,2月3日)的第一行,[2月3日,2月8日]的第三行,等等。
如果是这样的话,就没有容易的办法了。理想情况下,您可以计算数据源中的to)部分,或者可以使用icCube的ETL层来解决这个问题(Javascript和缓存)。注意,对于非常大的表,最后一种方法并不是一个好方法。
如果您可以按时间列进行排序,则算法将更容易,而不需要缓存整个表。
您可以使用描述链接的Javascript视图在此这里中找到一个模式示例。
希望它能帮上忙
发布于 2016-07-03 23:46:59
谢谢你的模式。不幸的是,我无法在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
Init代码:
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++ );
https://stackoverflow.com/questions/38097600
复制相似问题