原创: 2024-10-25 18:51
如果你在 DAX 中有一个字符串中的值列表,并且你想获取一个表格,其中列表中的每个项目对应一行,你可以按照以下步骤操作:
1.在字符串中使用 “|” 作为项目分隔符(而不是 “,” 或 “;”)
2.使用 PATHLENGTH 来确定字符串中的项目数量
3.使用 GENERATESERIES 来迭代字符串,为每个项目创建一行
4.使用 PATHITEM 提取项目,并使用 SELECTCOLUMNS 投影结果
下面是一个你可以用来测试的例子。
-- Covert a list of items in a string
-- into a table with one row for each item
--
-- PATHLENGTH determines the number of items
-- GENERATESERIES iterates the items
-- PATHITEM extract the Nth item
EVALUATE
VAR list = "123|456|789|764"
VAR _length =
PATHLENGTH ( list )
VAR Result =
SELECTCOLUMNS (
GENERATESERIES ( 1, _length ),
-- Use TEXT instead of INTEGER
-- to get a list of strings
"Item", PATHITEM ( list, [value], INTEGER )
)
RETURN
Result
这样,你就得到了一个可以更有效地用于筛选列的表格。
不过这不是一个好主意,因为你对表中的每一行都重复使用了 PATHCONTAINS 函数:
FILTER (
table,
PATHCONTAINS (
"123|456|789|764",
table[column]
)
)
这样会更好:
FILTER (
ALL ( table[column] ),
PATHCONTAINS (
"123|456|789|764",
table[column]
)
)
然而,如果table[column]具有高基数(即列中有很多不同的值),则这种方法仍然会受到性能的影响。因此,从原则上讲,这种方法更快:
VAR list = "123|456|789|764"
VAR _length =
PATHLENGTH ( list )
VAR _pivot =
SELECTCOLUMNS (
GENERATESERIES ( 1, _length ),
"Item", PATHITEM ( list, [value] )
)
VAR _filter =
TREATAS ( _pivot, table[column] )
RETURN
_filter
如果你将字符串作为常量参数,那么你应该明确使用更快的表构造函数语法:
-- Version with strings
TREATAS (
{ "123", "456", "789", "764" },
table[column]
)
-- Version with numbers
TREATAS (
{ 123, 456, 789, 764 },
table[column]
)