使用 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工坊