Power Query 中的计算

Calculations within Power Query

我正在尝试创建位于数百个 CSV 文件中的数据摘要 table。我创建了一些强大的查询来将数据转换为一个 table 包含五列(Name_Age、事件、MS、姓名、年龄)并将其导入到 table 中的 Excel ].这个 table 叫做 RawData。

在第二个选项卡中,我有一个 VBA 脚本将 RawData 复制到另一个名为 Prep 的 table 中。第二个 table 是必需的,因为我有第六列计算持续时间。第二个 table 是必要的,因为我不知道如何在 Power Query 中进行计算。

所以,MS代表毫秒。该字段表示事件发生的时间。我需要计算事件的持续时间,即下一个事件的 MS - 当前事件的 MS。以事件 AR 为例,我的公式采用 F (32635) 的 MS 减去 AR (32301) 的 MS 得到持续时间 334。ER 代表记录结束或相关时间线的结束学科。我如何在 Power Query 中执行此操作?

我可以在 Excel 中完成,但我正在使用宏将 RawData 复制到 Prep 中。我宁愿在 Power Query 中完成所有操作。另一个原因是我有一个数据透视表总结了整个事情。如果我能得到在 Power Query 中计算的持续时间,我就可以跳过宏。

为了从当前行的下一行中减去该字段,您需要使用相对单元格引用,如本文所述:http://excel-inside.pro/blog/2015/11/05/absolute-and-relative-references-in-power-query/

既然你想用数据透视表来评估数据table,我建议将数据加载到数据模型中,并使用 Power Pivot 来执行计算。使用公式

添加计算列
=CALCULATE(Min(Table1[MS]),FILTER(Table1,EARLIER(Table1[MS]) < Table1[MS]))

这将为您提供 MS 的最小值,该值大于当前行中的值。之后,您可以添加另一列,其中包含新列和 MS 列之间的差异,以获得持续时间。您需要包含一个 If 子句以将最高 MS 值的持续时间设置为 0(或者您想要处理的方式):

=If([CalculatedColumn1]=BLANK(),0,[CalculatedColumn1]-[MS])

您还可以在第一个公式中添加额外的过滤器,以仅比较与相同 "Name_Age":

相关的那些 MS 值
=CALCULATE(Min(Table1[MS]),FILTER(Table1,EARLIER(Table1[MS]) < Table1[MS] && EARLIER(Table1[Name_Age]) = Table1[Name_Age]))

有关 EARLIER() 的详细信息,请参阅 https://msdn.microsoft.com/en-us/library/ee634551(v=sql.110).aspx

试试这个(Power Query 代码):

let
Input = Excel.CurrentWorkbook(){[Name="RawData"]}[Content],

// 从源 table 列生成两个列表(时间和类型)。

Time = Input[MS],
Type = Input[Event],

// 创建一个要循环的整数列表,从 0 到时间列表的大小减去 1

Loop = {0..(List.Count(Time)-1)},

// 生成一个新列表 (Delta),计算持续时间减去时间列表中的值:value(position + 1) - value (position)。如果类型(位置)= "ER" returns "NA".

Delta = List.Transform(Loop, each if Type{_}="ER" then "NA" else Time{(_+1)}-Time{_}),

// 将Delta列表添加到原来的table.

Indexed = Table.AddIndexColumn(Input,"Duration"),
Output = Table.TransformColumns(Indexed, {"Duration", each Delta{_}})
in
Output