对于以下问题,我已经找到了可以在PowerBI中使用的解决方案(特别感谢Marco Vos)。现在,我意识到,如果PowerQuery已经进行了此计算,则对我而言将更加方便。
我想做什么:
生产线在启动事件(例如机器启动,机器停止等)时将时间戳记写入CSV文件。通过PowerQuery处理CSV文件,使所有开始日期在表的一列中均可用。该列称为“事件开始”。
要进一步分析机器的事件,我想添加另一列“ Event End”,其中也包含每个事件的结束日期。 CSV文件未提供结束日期,但它等于下一个事件的开始日期。
因此,我在PoweryQuery中需要做的是创建一个自定义列,该列将每一行的下一行的“开始日期”的值放入到当前行中。
我尝试过的事情:
我尝试在原始线程中使用与Marco Vos相同的原理:Sumif equivalent in PowerBI doesn't work properly with DAX function
BUT PowerQuery告诉我它不知道诸如CALCULATE之类的表达式。
有人可以在这个主题上支持吗?
编辑:
为了更接近该解决方案并向您展示我当前面临的问题,我尝试使用一个非常简单的表尝试以下代码: 该表仅在A列(“ ID”)中包含一个从1到10.000的序列号。 为了创建B列(“ ID-1”),该列应包含“序列号-1”,我基于Ollys注释使用了以下代码。
请注意:由于我们的IT部门禁止每次上传,因此我无法上传表格。
let
Source = Excel.Workbook(File.Contents("C:\Users\machine2321\Desktop\ID_sample.xlsx"), null, true),
Sheet1_Sheet = Source{[Item="Sheet1",Kind="Sheet"]}[Data],
#"Promoted Headers" = Table.PromoteHeaders(Sheet1_Sheet, [PromoteAllScalars=true]),
#"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"ID", Int64.Type}}),
#"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1),
#"Added ID-1" = Table.AddColumn(#"Added Index", "ID-1", each try #"Added Index"[ID]{[Index]+1} otherwise null),
#"Removed Index" = Table.RemoveColumns(#"Added ID-1",{"Index"})
in
#"Removed Index"
我认识到的问题是:
在Excel中使用PowerQuery处理此简单表已经花费了几分钟。在原始查询中,我处理2000+个文件,每个文件最多包含1.000个事件。通过使用上述方法,原始查询将运行数小时,然后中止并最后返回消息“意外错误”。
任何线索为什么代码需要如此大量的处理性能?
答案 0 :(得分:0)
您可以添加索引列,该索引列允许您基于相对索引值引用特定行中的值:
#"Added Index" = Table.AddIndexColumn(#"Previous Step", "Index", 0, 1),
#"Added Event End" = Table.AddColumn(#"Added Index", "Event End", each try #"Added Index"[Event Start]{[Index]+1} otherwise null, type datetime),
#"Removed Index" = Table.RemoveColumns(#"Added Event End",{"Index"})
try
... otherwise
被包括在内,以便最后一行不返回错误。
正如您所发现的那样,这种技术对于大型表是缓慢的。
有一种更快的技术,可以将“移位”表与原始表连接起来。完整的解释很长,在此处进行了详细介绍(包含代码):