使用上一行中的第n + 1行的值

时间:2019-07-05 07:28:04

标签: powerbi powerquery m

对于以下问题,我已经找到了可以在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个事件。通过使用上述方法,原始查询将运行数小时,然后中止并最后返回消息“意外错误”。

任何线索为什么代码需要如此大量的处理性能?

1 个答案:

答案 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被包括在内,以便最后一行不返回错误。

编辑:

正如您所发现的那样,这种技术对于大型表是缓慢的。

有一种更快的技术,可以将“移位”表与原始表连接起来。完整的解释很长,在此处进行了详细介绍(包含代码):

https://www.thebiccountant.com/2018/07/12/fast-and-easy-way-to-reference-previous-or-next-rows-in-power-query-or-power-bi/