人生没有彩排
每一天都是现场直播

XF.Analysis.BucketByRange

语法作用

通用分箱/桶函数,适用于年龄分组、客户价值分组等分箱场景,将根据ranges参数定义的阈值(左闭右开区间),查找expression参数的结果所在的区间,并返回labels参数中对应区间的标签。

  • expression参数:任意标量表达式。

  • ranges参数:阈值字符串,用分号隔开,例如 "0;100;200",其对应的区间为:[0,100)、[100,200)、≥200。

  • labels参数:区间名称字符串,用分号隔开,例如 "Low;Medium;High",将按顺序与ranges参数的区间一一对应。

注意:labels参数的标签中不能出现分号与竖杠。另外,若expression参数的值为空或小于定义的区间最小边界,则将返回空值。

XF.Analysis.BucketByRange(expression:expr,ranges:string,labels:string)

函数代码

该函数的实现代码如下:

/// 通用分箱/桶函数,适用于年龄分组、客户价值分组等分箱场景,将根据ranges参数定义的阈值(左闭右开区间),查找expression参数的结果所在的区间,并返回labels参数中对应区间的标签。expression参数:任意标量表达式。ranges参数:阈值字符串,用分号隔开,例如 "0;100;200",其对应的区间为:[0,100)、[100,200)、≥200。labels参数:区间名称字符串,用分号隔开,例如 "Low;Medium;High",将按顺序与ranges参数的区间一一对应。注意:labels参数的标签中不能出现分号与竖杠。另外,若expression参数的值为空 或 小于定义的区间最小边界,则将返回空值
FUNCTION XF.Analysis.BucketByRange = (expression:expr,ranges:string,labels:string) =>
    VAR CurVal = expression
    VAR RangeList = 
        VAR TransToPath = SUBSTITUTE(ranges,";","|")
        RETURN
        ADDCOLUMNS(
            GENERATESERIES(1,PATHLENGTH(TransToPath)),
            "RangeNbr",PATHITEM(TransToPath,[Value])*1
        )
    VAR LabelList =
        VAR TransToPath = SUBSTITUTE(labels,";","|")
        RETURN
        ADDCOLUMNS(
            GENERATESERIES(1,PATHLENGTH(TransToPath)),
            "Label",PATHITEM(TransToPath,[Value])
        )
    VAR RangeCount = COUNTROWS(RangeList)
    VAR LabelCount = COUNTROWS(LabelList)
    VAR CheckRangeCorrect = 
        NOT ISEMPTY(
            FILTER(
                ADDCOLUMNS(
                    RangeList,
                    "PrevRangeNbr",
                        VAR CurrIndex = [Value]
                        RETURN
                        MAXX(FILTER(RangeList,[Value]=CurrIndex-1),[RangeNbr])
                ),
                [RangeNbr]<=[PrevRangeNbr] && [Value]>1
            )
        )
    RETURN
    IF(RangeCount<>LabelCount || CheckRangeCorrect,
        ERROR("ranges参数与labels参数的区间数量不匹配,或ranges参数的区间定义顺序不正确!"),
        IF(NOT ISBLANK(CurVal) && CurVal>=MINX(RangeList,[RangeNbr]),
            VAR BucketIndexReverse = RANKX(RangeList,[RangeNbr],CurVal,DESC,Dense)
            VAR BucketIndex = RangeCount - BucketIndexReverse + 1
            RETURN
            MAXX(FILTER(LabelList,[Value]=BucketIndex),[Label])
        )
    )

应用示例

对各产品的采购价进行分组,并返回自定义标签。

XF.Analysis.BucketByRange([采购价],"0;50;100;200","便宜;一般;合适;有点贵")

结果如下图所示:

赞(0) 打赏
版权声明:本文为夕枫的原创文章,著作权归作者所有,未经允许不得转载
文章名称:《PowerBI DAX自定义函数-XF.Analysis.BucketByRange》
文章链接:https://www.ximaple.com/posts/1552.html
订阅评论
提醒
guest
0 评论
最新
最久 最赞
内联反馈
查看所有评论

觉得文章有用的话就支持一下吧~

感谢您的打赏支持,我将持续输出有价值的内容!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册

Operation don't support