昨天看到一个人在论坛上上求助,想找一个方法按照一定要求对数据进行分类。分类要求是查找原始数据中的BU Type隶属于分类依据中的哪个区间,然后输出该区间对应的Identifier值。其中AA-ZZ区间指的是所有两位字母组成的BU Type。而以两位数字组成的BU Type则被分成了两类,一类是位于30-39区间的,还有一类是剩余数字区间的。
分类要求比较明显,解决方法也有很多种。可以用SEARCH函数来解决,判断当前BU Type中是否包含数字3,如果是,输出的Identifier就是2,如果不是,看是否是数字,如果是数字,Identifier就是3,如果不是数字,那就输出1。这种方法比较直接,但是扩展性不好。如果字母也有分类,就无法很好的解决问题了。
Identifier =
IF (
SEARCH ( "3", 'Type'[BU Type],, 0 ) = 1,
"2",
IF ( ISERROR ( VALUE ( 'Type'[BU Type] ) ), "1", "3" )
)
有一个小伙伴share了他的解决方案,方法就很好。先看一下他如何解决的,首先通过“输入数据”的方式把分类条件存储到Power BI中。在输入的时候,他做了数据转换,创建了两个列,一个是Lower,用来存储分类区间的其实值,另外一个是Higher,用来存储分类区间的结束值。
创建完毕表单后,在原始数据列上创建了一个计算列,调用下面公式就轻松的获得了分类值。
ID =
CALCULATE (
VALUES ( Identifier[Identifier] ),
FILTER (
Identifier,
'Type'[BU Type] >= Identifier[Lower]
&& 'Type'[BU Type] <= Identifier[Higher]
)
)
ID这个表达式实际上利用的原理是比较两个表单特定列是否有相同值。首先利用CALCUALTE函数功能,将行上下文转换成筛选上下文,之后通过FILTER函数去基于 Identifier表单构造一个子表单,该子表单中只包含与当前行’Type’[BU Type] 值相对应的数据,最后再对应输出ID值。
这个表达式最根本点在于利用了字符串大小比较这一方法关系来判断’Type’[BU Type]位于哪个分类区间。数字类型的数据进行比较非常简单直观明了,但是字符串之间也可以进行大小比较,这个估计用到的情况就比较少见了。这里的字符串大小比较不是指字符串长度,而是比较字母A是否大于字母B,或者字母A是否大于字母DC这种判断。
从自然语言的意思是来说其实做这种字母直接的比较并不具备大小意义,但是在计算机语言中则可以进行比较。比较的原则就是利用对应字符串的ASCII来进行。比如大小字母A的ASCII码十进制是65,而小写d的ASCII码是100,这样A就比d大。而对于AC和AF这两组字符串的比较,则遵循从左向右比较的原则,先看比较两端第一个字符,如果相同,就看第二个字符,然后以第二个字符的比较结果作为最终结果。所以AC>AF。而对于abc和ab进行比较,则还是遵从从左到右的顺序,挨个比较对应位置字符,由于前两位都相同,而第三位上abc有数据,ab没有,所以abc>ab。
在Power BI当中,对于数字来说,如果当前列column的数据类型是文本text类型,则这种数字大写的比较也按照ASCII码规则进行。例如当文本列存储10和99这两个字符串是,比较的结果是10>99。因为1对应的ASCII码是49,而9的ASCII码则是57。
这样,利用CALCULATE + FILTER 进行求解的表达式就可以使用多种分类要求,有很强的扩展性。