Power BI使用WINDOW窗口函数计算ABC分类
ABC分类大家一定不陌生了,也是我们常说的二八法则,即80%的效能是由20%的产品一个贡献的,因为最近在看人才数据分析的书,书中也提到了另外一个观点,企业资产中80%的资产是由于人或者专利等组成的无形资产。
切入正题,我们应该如何在ABC分类中使用WINDOWS函数呢。
先来看下数据模型,比如简单,只有销售表和产品表
基础度量值
销售额 = SUM('销售'[销售额] )
常用方法
先来回顾下以前我们是怎么做的,先计算累计值,这里逻辑也很简单,每次计算的都是大于等于当前销售额的数
销售额.累加 =
var cur = [销售额]
RETURN
CALCULATE(
[销售额],
FILTER(ALL('产品'),'产品'[销售额]>=cur)
)
ABC分类,代码也很简单,根据累加销售占所有产品销售的比例来计算所属分类
ABC分类 =
var persent =
DIVIDE(
[销售额.累加],
CALCULATE([销售额], ALL('产品'))
)
return
SWITCH(
TRUE(),
persent<=0.7,"A",
persent<=0.9,"B",
"C"
)
不知道有没有和我一样自己讨厌写注释,更讨厌读别人没注释的代码,其实,我们也可以使用ChatGPT来写注释(不过最近几天因为众所周知的原因,可能无法使用。)
这种写法其实会存在问题,如下,因为相同销售额的产品太多,造成了没有B类,当然也会存在没有A类的情况,比如某个产品的销售额直接超过了总销售额的80%,这里暂不讨论这种情况。
累计优化
在之前有介绍过如何处理销售额相同的情况,简单来说就是像在Excel中求某一列的累加值一样,一行行来,放到DAX中即是如果销售额相同,再比较产品序列
销售额.累计.去重 =
VAR cur =[销售额]
VAR index = SELECTEDVALUE( '产品'[产品] )
RETURN
CALCULATE(
[销售额],
FILTER(
ALL( '产品'[产品] ),
[销售额] > cur ||AND( [销售额]= cur,'产品'[产品] <= index )
)
)
这时再看会发现不会存在多行是同一个累计值了,ABC的分类也会和先前不同
WINDOW窗口函数
微软在去年就出了窗口函数,使用窗口函数可以直接解决我们上面遇到的不同产品销售额相同造成分类不准确的问题。
WINDOW – DAX Guide — 窗口 – DAX 指南,该函数返回位于给定间隔内的多个行,具体语法可参考sqlbi的说明。
销售额.累计.window =
CALCULATE(
[销售额],
WINDOW(
1, ABS, 0, REL,
ADDCOLUMNS(
ALL( '产品'[产品] ),
"@cumsales", [销售额]
),
orderby( [@cumsales],Desc, '产品'[产品], ASC )
)
)
来看下效果,不仅没有出现相同累计值的情况,总计行也不用再单独处理了。
那么,性能呢?因为数据量很小,所以时间上差距并不大,但还是可以看到在使用WINDOW的方法查询更少
本篇文章来源于微信公众号: PowerBI木小桼