我正在使用Pentaho数据集成(Spoon,在Kettle之前)进行ETL过程。
在Pentaho的 Modified Javascript 步骤中,您可以设置开始,结束和转换脚本。在转换脚本中,您可以编写仅针对每一行执行的代码,并且从此处我不知道如何访问上一行的数据(如果可能的话)。
我需要访问上一行,因为所有行都按产品,商店和日期(分别)排序,的目标是从上一行获取现有数量并添加销售或收到的数量当前行(这将是相同的产品,同一商店但不同的日期)。我还需要访问上一行来比较当前行的产品和存储与前一行,因为如果有人更改我必须重新启动字段quantity_on_hand(我使用名为initial_stock的所有列的字段进行)。
在伪代码上会是这样的(如果我没有限制,只为每一行执行在步骤上编写的代码):
while(all_rows_processed()){
current_row.quantity_on_hand = current_row.initial_stock;
while(id_product_current_row == id_product_previous_row && id_store_current_row == id_store_previous_row){
current_row.quantity_on_hand = previous_row.quantity_on_hand + current_row.stock_variation;
}
}
这question related无法帮助我。
任何解决我问题的想法都会受到赞赏。
答案 0 :(得分:2)
我可以请你重新考虑分组吗?它似乎适合您的场景。 如果您根据组合日期/商店/文章对流进行排序,则可以计算出售/接收数量的累计总和。通过这种方式,您可以获得可在组基础上重置的库存变化的总计。
同时查看此blog post和论坛帖子的引用。
答案 1 :(得分:1)
我怀疑你需要为此寻求JavaScript。查看Analytic query
步骤。这将允许您将前一行的值带入当前行。
JavaScript步骤为您提供了极大的灵活性,但如果您可以使用常规转换步骤,它通常会更快。
答案 2 :(得分:1)
使用分析查询。通过使用此步骤,您可以访问上一个/下一个记录。实际上,不仅可以阅读上一个和下一个记录,而且你可以阅读N Rows Fordward或N Rows Back Wards。
检查以下网址以获得更清晰的解释:
答案 3 :(得分:0)
谢谢大家,我已经解决了我的问题。
我结合了您的所有建议,并使用了Analytic Query
,Modified Javascript
和Group by
步骤。
虽然问题不是很好,但我遇到的问题是计算每一行的库存水平(每个产品,日期和商店组合都有一行)。
首先(显然晚于按product_id
,store_id
和date
升序排序行),我使用Analytic Query
步骤按product_id
分组{ {1}},因为在此步骤中,我有一个新字段store_id
来标识每个组的第一行(previous_date
在日期最早的组的行上。{/ p>
然后我需要在第一行(每个组的第一个日期,因为它按日期排序)计算每个组[product,store]的previous_date=null
,因为quantity_on_hand
对于每个组是不同的。这是因为initial_stock
。
最后(并且密钥在这里),我使用(sum(quantity_received) - sum(quantity sold)) != quantity_on_hand
步骤,如@andtorg建议,并在下一个图像显示时执行。
link建议的@andtorg非常有用。它甚至包括两个Group by
示例文件。
非常感谢您的帮助!