PowerQuery数据分析

powerquery中如何对连续N行进行计算?

2019-10-15  本文已影响0人  PowerQuery

需求也比较简单,如下图所示:


需求

对每一天的前三天(包含当天)对应的数值求和,比如8月4日前三天(2-4日)数值求和结果为14,8月5日前三天(3-5日)数值求和结果为17,8月6日前三天(4-6日)数值求和结果为22……以此类推。

这个需求和上一篇帖子《在powerquery中如何对相邻两行进行计算?》的情形类似,只是稍微复杂了一些。

所以处理思路也是一样的。

首先添加索引列

添加索引列

然后新增列来获取处理结果

新增列这里有两种思路:
一种是直接获取每一行的记录, 然后把它们放到一个list中用List.Sum求和;
另一种方法更加“优雅”一些,通过动态获取区间,然后再放到List.Sum中求和。

方法一:获取所有行记录

= Table.AddColumn(已添加自定义, "连续3行求和", each  
if
  [索引]>1 
then 
  List.Sum({已添加自定义[数值]{[索引]-2},已添加自定义[数值]{[索引]-1},已添加自定义[数值]{[索引]}})   
else  
  null)

List.Sum函数是对计算范围内的数值列表【也就是数值列的一个片段】进行求和。
接下来要选取符合要求的数值列表。
那么怎么选择呢?就是在【数值】列中,选择当前行索引号减去2所得到的索引值所对应的行,从它开始,在【数值】列中往后选3个值。

由于第一二行不足3行,所以没法计算结果,用if来判断索引值是否大于1(因为索引是从0开始),如果不是则设置为null值。

方法二:动态获取求和区间

只需要把方法一中List.Sum那一行换成如下的即可:

List.Sum(List.Range(更改的类型[数值],[索引]-2,3))

这种方法要简洁、“优雅”得多。甚至可以把它再进一步优化为:

List.Sum(List.Range(更改的类型[数值],[索引]-(n-1),n))

其中的n就是每一个求和区间的长度:如果每3行求和,就是我们的例子;如果每五行求和,也同样适用。这样就把整个求和行数参数化了。

最后得到的结果如下:


处理结果
上一篇下一篇

猜你喜欢

热点阅读