Power Query

时间:2016-03-16 05:29:12

标签: excel excel-vba powerquery vba

我正在尝试创建一个位于几百个CSV文件中的数据汇总表。我创建了一些电源查询,将数据转换为一个包含五列(Name_Age,Events,MS,Name,Age)的表,并将其导入到Excel中的表中。该表称为RawData。 RawData Example

在第二个选项卡中,我有一个VBA脚本将RawData复制到名为Prep的第二个表中。第二个表是必要的,因为我有第六列计算持续时间。第二个表是必要的,因为我无法弄清楚如何在Power Query中进行计算。 Prep Example

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

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

由于您希望使用数据透视表评估数据,我建议将数据加载到数据模型中并使用Power Pivot执行计算。添加公式

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

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

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

您还可以在第一个公式中添加其他过滤器,以仅比较与相同&#34; Name_Age&#34;相关的那些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

答案 2 :(得分:0)

尝试一下(高级查询代码):

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

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

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

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

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

//生成一个新列表(增量),计算持续时间,减去持续时间列表中的值:value(位置+1)-value(位置)。如果Type(position)=“ ER”返回“ NA”。

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

//将Delta列表添加到原始表中。

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