使用 DAX 将字符串列表转换为表格
本文翻译自Marco Russo的文章—《Strings list to table in DAX》来源:SQLBI DAX 在数据处理方面与 M 不同,它并不应该用来进行这样的操作。但是,如果你需要在 DAX 中实现类似于 M 中的 Table.FromList 的功能,那么这篇博客文章就是为你准备的。
如果你在 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]
)
如果您想深入学习微软Power BI,欢迎登录网易云课堂试听学习我们的“从Excel到Power BI数据分析可视化”系列课程。或者关注我们的公众号(PowerPivot工坊)后猛戳”在线学习”。
长按下方二维码关注“Power Pivot工坊”获取更多微软Power BI、PowerPivot相关文章、资讯,欢迎小伙伴儿们转发分享~
Power Pivot工坊
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)