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