事后有条件地加入和'collectively'操作非规范化的一对多拆分



准确命名和解释的技巧-如果有什么不清楚的地方,请告诉我。

我有一个去规范化的数据流,考虑一下:

Input one:
ID
Value
FKID
Input two:
FKID
DiffValue
CheckValue

输入一可以有多个输入两行,显然与FKID有关。

现在,加入后,我可能会有这样的东西:

[ID] - [Value] - [DiffValue] - [CheckValue]
1 - A - D1 - C1
1 - A - D2 - C1
1 - A - D3 - C2

然后,我根据CheckValue进行条件拆分,搜索值:C2。如果为C2,则将"值"更改为"差异值"。留给我的是:

拆分一个:

1 - A - D1 - C1
1 - A - D2 - C1

一分为二:

1 - D3 - D3 - C2

现在,我想确保我的所有行都具有D3值。这里的问题是,拆分可能永远不会变为真,在这种情况下,我只需要继续,保持原始的A值,但如果只有一行满足checkvalue条件,那么所有行都需要DiffValue。

脚本转换组件不起作用,因为它是基于缓冲区的,而且我不能缓存所有行,在将它们发送到输出之前,一次对整个行集合执行代码。我甚至不能对临时SQL执行简单的保存ID,然后根据ID进行查找,因为在条件拆分之后,它是两个平行的异步路径,所以在填充临时SQL表之前,我不能停止第一个拆分。

我可以做一个脚本目的地,然后缓存所有行,在缓存完每一行后执行操作,然后用相关列生成自定义输出,但是,还有更多的列(这是一个简化的示例),必须处理自定义输出的维护工作量很大。

我该怎么做?

我通过在拆分之前添加一个额外的列来解决这个问题,该列名为HasNeedValue(为了简单起见,转述)。然后我删除了拆分,取而代之的是单个脚本转换。

在流程行中,我检查我需要满足的值(在示例中为CheckValue=C2),如果它满足我的条件,我将HasNeedValue设置为1。然后,我在HasNeedValue(desc)上的脚本后面添加了一个排序,将其全部导入到一个新的脚本转换中,其中包含[ID]的列表。

在进程行中,我检查HasNeedValue是否为1,如果为1,则将DiffValue复制到Value,并将ID插入列表中。如果它不等于1,那么我检查列表是否包含ID,并将DiffValue复制到Value。

这确保了可能具有在所有行上设置值所需的值的一行始终是第一行,并且我知道对于不具有必要条件的行,它是哪个ID。

最新更新