如何用DAX对列表列中的字符串计算去重值?
解决DAX中针对列表内值的去重统计问题
当然可以实现这个需求!你想要针对每个用户名下的所有嵌套列表做去重单词计数,不用手动遍历,通过DAX的函数组合就能轻松搞定。
核心思路
我们需要先把每个用户对应的所有列表展开成单个单词的集合,再对这个集合做去重后计数。这里用到GENERATEALL来展开列表,DISTINCT去重,最后用COUNTROWS统计数量。
度量值代码
假设你的表名为WordTable,可以创建如下度量值:
Distinct Word Count = VAR CurrentUserWords = // 筛选当前用户的所有行,展开每行的Word List为单个单词行 GENERATEALL( FILTER( WordTable, WordTable[Name] = SELECTEDVALUE(WordTable[Name]) ), WordTable[Word List] ) VAR UniqueWordSet = DISTINCT( CurrentUserWords[Value] ) RETURN COUNTROWS( UniqueWordSet )
代码解释
CurrentUserWords:这一步会筛选出当前上下文(比如表格中选中的Name)对应的所有行,然后用GENERATEALL把每行的列表拆分成单独的单词行。比如Bob的两行列表会被拆成6个单词行(重复的aye/bee/cee各出现两次)。UniqueWordSet:用DISTINCT对展开后的单词行去重,得到当前用户的唯一单词集合。- 返回计数:最后用
COUNTROWS统计去重后的单词数量,就是你要的结果。
验证结果
把这个度量值放到包含Name列的表格视觉对象中,就能得到你期望的输出:
- Bob的去重单词数:3
- Jim的去重单词数:3
- Ray的去重单词数:6
如果想要更紧凑的写法,也可以把步骤合并成一行:
Distinct Word Count = COUNTROWS( DISTINCT( GENERATEALL( FILTER( WordTable, WordTable[Name] = SELECTEDVALUE(WordTable[Name]) ), WordTable[Word List] )[Value] ) )
注意:如果你的"Word List"是文本格式(比如用逗号分隔的字符串)而不是DAX列表,需要先通过
TEXTSPLIT函数把文本转成列表,再用上述逻辑处理。
内容的提问来源于stack exchange,提问作者mik_ste
相关产品推荐
相关产品推荐

