power bi能够处理的数据量(累计数据还原为当期数据)
power bi能够处理的数据量(累计数据还原为当期数据)也就是日期是当前日期的上一日,并且用户等于当前用户的行,获取该行的累计数据,就是上一日该客户的数据,然后用本行累计数据减去上一日的累计数据,便是本客户的当日发生数。(x)=>x[日期]=Date.AddDays([日期] -1) and x[用户]=[用户]在PowerQuery的界面功能中,无法直接实现,这种情况下我们就需要用M来计算。将数据导入到PowerQuery编辑器中,添加自定义列:List.Sum( {[累计数据] -List.Sum( Table.SelectRows( 更改的类型 (x)=>x[日期]=Date.AddDays([日期] -1) and x[用户]=[用户] )[累计数据] )} )这个M
你也许也遇到这样的情况,数据中的每日记录是历史累计数,而需要分析的是当日发生数据,这就需要将累计的数据还原为当日数据,在PowerBI中,有多种方式可以实现这种计算。
模拟示例数据如下:
这个数据中记录了每个用户的每日历史累计数据,下面就通过这个示例介绍如何用M以及DAX来计算出当日数据,并帮你理解这些方法的异同之处。
Power Query法
在PowerQuery的界面功能中,无法直接实现,这种情况下我们就需要用M来计算。
将数据导入到PowerQuery编辑器中,添加自定义列:
List.Sum(
{[累计数据]
-List.Sum(
Table.SelectRows(
更改的类型
(x)=>x[日期]=Date.AddDays([日期] -1) and
x[用户]=[用户]
)[累计数据]
)}
)
这个M公式的难点主要是如何计算上一日的累计数,它是利用Table.SelectRows来筛选行,筛选的条件就是:
(x)=>x[日期]=Date.AddDays([日期] -1) and x[用户]=[用户]
也就是日期是当前日期的上一日,并且用户等于当前用户的行,获取该行的累计数据,就是上一日该客户的数据,然后用本行累计数据减去上一日的累计数据,便是本客户的当日发生数。
关于这个M公式,你需要有一点语法基础才能看懂,如果暂时看不懂也没有关系,记住这种套路,需要的时候可直接套用。
上面是用M实现的,用DAX当然也可以实现,下面就分别介绍计算列和度量值实现的方式。
DAX-计算列法
计算列的写法如下:
关键是第8行的表达式,筛选逻辑与上面的M完全一致,只不过这是DAX的表达方式,也是根据当前行的日期和用户,找出上一日相同客户的累计数据,最终的结果与PQ也是一样的。
DAX-度量值法
将数据表中的日期和用户作为上下文,度量值就可以这样写:
其结果也是一样的:
仔细观察度量值和计算列写法的区别,其中最关键的一点是,在度量值中,并不需要在筛选表达式中指定,用户与当前行的用户一致,因为度量值会自动接受当前外部用户上下文的筛选。
如果在模型中建立日期表,构建数据模型,其实还可以用时间智能函数来实现这种需求,度量值写法更加简单。
直接使用PREVIOUSDAY筛选上一日,计算上一日的累计数据,然后相减得到本日的发生额。
其实度量值可以直接得到每日发生额,无需在PowerQuery中添加自定义列,也无需在模型中添加计算列,非必要时也不建议在数据中添加列,度量值才是推荐的做法。
上面几种方法,整体的计算逻辑是一样的,都是先筛选出上一日同一客户的累计数,然后通过本日的累计减去上日累计数得到。只不过筛选的方式略有差异,除了M和DAX函数和语法本身的差异,关键是上下文的影响:
- M的上下文是表的当前行,不能自动筛选,需要显式的M表达式进行筛选;
- 计算列的上下文也是当前行,行上下文不能自动筛选,需要需要显式的DAX表达式进行转换;
- 度量值的上下文是各种外部筛选器,可以自动产生筛选作用,对于不需要转换直接应用的筛选器,无需在DAX内部显式表达。
以上就是将累计数据还原为当日数据的几种方法,关键是通过这个简单的计算掌握各种方法的筛选逻辑。
更多推荐:
利用Power Query,PowerBI轻松展示最近N天
PowerBI中的关系为什么有虚线?这篇文章告诉你
PowerBI生态重大进展,一文带你玩转DAX计算组
采悟 | powerbi星球