语法作用
通用分箱/桶函数,适用于年龄分组、客户价值分组等分箱场景,将根据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","便宜;一般;合适;有点贵")
结果如下图所示:






