使用前一行中第 n+1 行的值
Use of value from row n+1 in previous row
对于以下问题,我已经找到了适用于 PowerBI 的解决方案(特别感谢 Marco Vos)。现在,我意识到如果这个计算已经由 PowerQuery 完成,对我的目的来说会更方便。
我想做的事情:
生产线在开始事件(例如机器启动、机器停止等)时将时间戳写入 CSV 文件。 CSV 文件由 PowerQuery 处理,所有开始日期都在 table 的一列中可用。该列名为 "Event Start".
为了进一步分析机器的事件,我想添加另一列 "Event End",其中还包含每个事件的结束日期。 CSV 文件未提供结束日期,但它等于下一个事件的开始日期。
所以我需要在 PoweryQuery 中做的是创建一个自定义列,在每一行中从下一行中获取 "start date" 的值并将其放入当前行中。
我尝试过的:
我尝试使用与 Marco Vos 在我的原始线程中给出的相同的原则:
但是 PowerQuery 告诉我它不知道像 CALCULATE 这样的表达式。
有人可以支持这个话题吗?
已编辑:
为了更接近解决方案并向您展示我目前面临的问题,我使用非常简单的 table 尝试了以下代码:
table 仅包含 A 列中从 1 到 10.000 的序号 ("ID")。
为了创建应包含 "sequence number - 1" 的列 B ("ID-1"),我根据 Ollys 评论使用了以下代码。
请注意:我无法上传 table 因为每次上传都被我们的 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 处理这个简单的 table 已经需要几分钟。在原始查询中,我处理了 2000 多个文件,每个文件最多包含 1.000 个事件。通过使用上面描述的方法,原始查询运行了几个小时,中止并且 returns 消息 "Unexpected error" 最后。
知道为什么代码需要如此大量的处理性能吗?
您可以添加一个索引列,它允许您根据相对索引值引用特定行中的值:
#"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
包含在内,因此不会为最后一行返回错误。
编辑:
如您所见,此技术对于大型 tables 来说很慢。
有一种更快的技术,它将 'shifted' table 与原件连接起来。完整的解释很长,在这里详细介绍(带代码):
对于以下问题,我已经找到了适用于 PowerBI 的解决方案(特别感谢 Marco Vos)。现在,我意识到如果这个计算已经由 PowerQuery 完成,对我的目的来说会更方便。
我想做的事情:
生产线在开始事件(例如机器启动、机器停止等)时将时间戳写入 CSV 文件。 CSV 文件由 PowerQuery 处理,所有开始日期都在 table 的一列中可用。该列名为 "Event Start".
为了进一步分析机器的事件,我想添加另一列 "Event End",其中还包含每个事件的结束日期。 CSV 文件未提供结束日期,但它等于下一个事件的开始日期。
所以我需要在 PoweryQuery 中做的是创建一个自定义列,在每一行中从下一行中获取 "start date" 的值并将其放入当前行中。
我尝试过的:
我尝试使用与 Marco Vos 在我的原始线程中给出的相同的原则:
但是 PowerQuery 告诉我它不知道像 CALCULATE 这样的表达式。
有人可以支持这个话题吗?
已编辑:
为了更接近解决方案并向您展示我目前面临的问题,我使用非常简单的 table 尝试了以下代码: table 仅包含 A 列中从 1 到 10.000 的序号 ("ID")。 为了创建应包含 "sequence number - 1" 的列 B ("ID-1"),我根据 Ollys 评论使用了以下代码。
请注意:我无法上传 table 因为每次上传都被我们的 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 处理这个简单的 table 已经需要几分钟。在原始查询中,我处理了 2000 多个文件,每个文件最多包含 1.000 个事件。通过使用上面描述的方法,原始查询运行了几个小时,中止并且 returns 消息 "Unexpected error" 最后。
知道为什么代码需要如此大量的处理性能吗?
您可以添加一个索引列,它允许您根据相对索引值引用特定行中的值:
#"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
包含在内,因此不会为最后一行返回错误。
编辑:
如您所见,此技术对于大型 tables 来说很慢。
有一种更快的技术,它将 'shifted' table 与原件连接起来。完整的解释很长,在这里详细介绍(带代码):