以这个大略的数据为例:
如何找出相同产品每笔订单的上一笔的订单日期呢?这里通过M和DAX几种办法来实现这个需求。
利用M添加自定义列

在PowerQuery中添加自定义列:
上个订单日期=
List.Max(
Table.SelectRows(
变动的类型,
(x)=>
x[产品名称]=[产品名称] and
x[订单日期]<[订单日期]
)[订单日期]
)
利用DAX添加打算列
在数据视图中添加打算列:
上个订单日期 =
VAR a=[产品名称]
VAR b=[订单日期]
VAR c=
CALCULATE(
MAX('数据表'[订单日期]),
FILTER('数据表','数据表'[产品名称]=a&&'数据表'[订单日期]<b)
)
RETURN c
利用DAX创建度量值
上面都是添加列的方法,还可以利用度量值来实现,在高下文不变的情形下,度量值的写法也与打算列类似:
上个订单日期 度量值 =
VAR a=MAX([产品名称])
VAR b=MAX([订单日期])
VAR c=
CALCULATE(
MAX('数据表'[订单日期]),
FILTER(ALL('数据表'),'数据表'[产品名称]=a&&'数据表'[订单日期]<b)
)
RETURN c
上面几种办法,无论是M还是DAX,无论是添加列还是度量值,实在逻辑是一样的。
都是先筛选出产品名称即是当前行的产品名称、并且订单日期小于当前当前行订单日期的所有行(M函数利用 Table.SelectRows筛选,DAX利用FILTER函数筛选),然后打算筛选结果的最大订单日期,也便是上一个订单日期。
现在有了窗口函数,实在利用窗口函数打算更加大略,比如利用OFFSET函数来写个度量值:
上个订单日期 OFFSET =
CALCULATE(
MAX('数据表'[订单日期]),
OFFSET(
-1,
ALLSELECTED('数据表'[订单日期],'数据表'[产品名称]),,,
PARTITIONBY('数据表'[产品名称]))
)
将这个度量放到上面的可视化表格中,结果与前面的做法完备一样。
关于窗口函数的用法可以参考:
Power BI本月正式推出的DAX新函数:OFFSET、INDEX、WINDOW
PowerBI剖析技巧:利用窗口函数进行帕累托剖析,大幅提升性能
以上便是打算上个订单日期的几种办法,有了它就可以进一步打算上个订单日期的数据以及订单间隔天数等,也可以进行上一行下一行的干系打算,灵巧利用可以办理各种类似的问题。
「PowerBI星球」内容合集(2023版)
PowerBI星球