使用 DAX 将字符串列表转换为表格

原创:      2024-10-25 18:51


本文翻译自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]

)


客户案例

按行业 按部门

线上课程

课程直通 讲师介绍

官方微信

联系我们

北京

13811982114
agileex@agileex.com

北京市朝阳区博雅国际中心A座601

上海

13811982114
agileex@agileex.com

上海市静安区沪太路453号302室

Copyright © 2022 北京敏捷艾科数据技术有限公司agileex.com - 京ICP备16008845号-1