String POWERBI、DAX:连接字符串、拆分和保留子字符串仅一次
我试着做到以下几点:String POWERBI、DAX:连接字符串、拆分和保留子字符串仅一次,string,loops,powerbi,unique,dax,String,Loops,Powerbi,Unique,Dax,我试着做到以下几点: 我有一个带字符串的列,每个列可以有几个由分隔符分隔的子字符串“:” 我需要连接列字符串(我在这里做一个过滤器,只保留相互测试行) 然后根据分隔符拆分“:” 如果子字符串重复,则只保留一次 例如: ColumnHeader AA:BB:CC BB:DD DD:AA:EE EE:AA:DD:BB BB:EE ... 预期结果将是唯一的字符串: "AA:BB:CC:DD:EE" 在DAX中如何填写新列 我希望在DAX中找到for/while循环,就像在
- 我有一个带字符串的列,每个列可以有几个由分隔符分隔的子字符串“:”
- 我需要连接列字符串(我在这里做一个过滤器,只保留相互测试行)
- 然后根据分隔符拆分“:”
- 如果子字符串重复,则只保留一次
ColumnHeader
AA:BB:CC
BB:DD
DD:AA:EE
EE:AA:DD:BB
BB:EE
...
预期结果将是唯一的字符串:
"AA:BB:CC:DD:EE"
在DAX中如何填写新列
我希望在DAX中找到for/while循环,就像在Python中一样。。。但失败了
我试过这个:
List =
VAR SIn = ""
VAR SOut = ""
VAR Cursor = 0
VAR SList =
CONCATENATEX(
FILTER(ATable, ATable[Name] = CTable[Name]),
[ColumnHeader],
":")
VAR pos1 = FIND(":", SList, Cursor, len(SList))
VAR pos2 = FIND(":", SList, pos1, len(SList))
VAR elem = TRIM(MID(SList, pos1+1, pos2-pos1))
// following is not good but is what I would like to do:
VAR SOut = CONCATENATE(SOut, elem)
VAR SList = MID(SList, pos2, len(SList)-pos2)
VAR Cursor = pos2
// I need to loop ... but how ? ... as no for/while loops are possibles ?
谢谢你的帮助
=====================================
由于下面的答案,我成功地解决了这个问题
为了更好地理解全球问题,我仍将提供更大的数据集:
我有两张桌子:
TABLE_BY_ELEMENT
KEY GROUP LIST KEY_DATA
1 G1 AA:BB:FF 11
2 G1 CC:AA 22
3 G1 FF:DD:AA 33
4 G1 CC:DD:AA 44
5 G2 CC:FF:GG 55
6 G2 BB:AA 66
TABLE_BY_GROUP
GROUP GROUP_DATA
G1 1111
G2 2222
我想查看如下数据:
RESULT_BY_GROUP
GROUP GROUP_DATA NewList
G1 111 AA:BB:FF:CC:DD
G2 222 CC:FF:GG:BB:AA
List = CONCATENATEX( VALUES('Table'[ColumnHeader]), 'Table'[ColumnHeader], ":" )
而且:
RESULT_ELEMENT
KEY LIST KEY_DATA
1 AA:BB:FF 11
2 CC:AA 22
3 FF:DD:AA 33
4 CC:DD:AA 44
5 CC:FF:GG 55
6 BB:AA 66
我希望这更容易理解。DAX不适合这样做。如果您需要使用DAX使其成为一个动态度量,那么您可能需要重塑数据以使其更可用。比如说,
ID ColumnHeader
1 AA
1 BB
1 CC
2 BB
2 DD
3 DD
3 AA
3 EE
...
您可以在查询编辑器中使用“拆分列”>“按分隔符”工具进行拆分,并选择在冒号上拆分并展开为行
一旦它以这种更有用的格式出现,您就可以在DAX中使用它,如下所示:
RESULT_BY_GROUP
GROUP GROUP_DATA NewList
G1 111 AA:BB:FF:CC:DD
G2 222 CC:FF:GG:BB:AA
List = CONCATENATEX( VALUES('Table'[ColumnHeader]), 'Table'[ColumnHeader], ":" )
借用DAX的逻辑,完全可以在DAX中实现这一点,但我不推荐这种方法
List =
VAR LongString =
CONCATENATEX ( VALUES ( 'Table1'[ColumnHeader] ), Table1[ColumnHeader], ":" )
VAR StringToPath =
SUBSTITUTE ( LongString, ":", "|" )
VAR PathToTable =
ADDCOLUMNS (
GENERATESERIES ( 1, LEN ( StringToPath ) ),
"Item", PATHITEM ( StringToPath, [Value] )
)
VAR GroupItems =
FILTER (
SUMMARIZE ( PathToTable, [Item] ),
NOT ISBLANK ( [Item] )
)
RETURN
CONCATENATEX ( GroupItems, [Item], ":" )
让您的桌子如下所示- 现在尝试下面的高级编辑器代码,在电源查询编辑器-
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WcnS0cnKycnZWitWJVgKyXFzALBcXK6CMqyuY4+oK4gCFnJxgykAysQA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [ColumnHeader = _t]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"ColumnHeader", type text}}),
//--NEW STEPS STARTS FROM HERE
#"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 1, 1, Int64.Type),
#"Reordered Columns" = Table.ReorderColumns(#"Added Index",{"Index", "ColumnHeader"}),
#"Split Column by Delimiter" = Table.SplitColumn(#"Reordered Columns", "ColumnHeader", Splitter.SplitTextByDelimiter(":", QuoteStyle.Csv), {"ColumnHeader.1", "ColumnHeader.2", "ColumnHeader.3", "ColumnHeader.4"}),
#"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"ColumnHeader.1", type text}, {"ColumnHeader.2", type text}, {"ColumnHeader.3", type text}, {"ColumnHeader.4", type text}}),
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type1", {"Index"}, "Attribute", "Value"),
#"Removed Columns" = Table.RemoveColumns(#"Unpivoted Other Columns",{"Attribute", "Index"}),
#"Removed Duplicates" = Table.Distinct(#"Removed Columns"),
#"Sorted Rows" = Table.Sort(#"Removed Duplicates",{{"Value", Order.Ascending}}),
#"Added Index1" = Table.AddIndexColumn(#"Sorted Rows", "Index", 1, 1, Int64.Type),
#"Reordered Columns1" = Table.ReorderColumns(#"Added Index1",{"Index", "Value"}),
#"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(#"Reordered Columns1", {{"Index", type text}}, "en-US"), List.Distinct(Table.TransformColumnTypes(#"Reordered Columns1", {{"Index", type text}}, "en-US")[Index]), "Index", "Value", List.Max),
#"Merged Columns" = Table.CombineColumns(#"Pivoted Column",{"1", "2", "3", "4", "5"},Combiner.CombineTextByDelimiter(":", QuoteStyle.None),"Merged")
in
#"Merged Columns"
这是最终输出-
以下是电源查询编辑器中的代码- 使用以下代码按组创建一个新表-
let
Source = TABLE_BY_ELEMENT,
#"Removed Columns" = Table.RemoveColumns(Source,{"KEY", "KEY_DATA"}),
#"Split Column by Delimiter" = Table.SplitColumn(#"Removed Columns", "LIST", Splitter.SplitTextByDelimiter(":", QuoteStyle.Csv), {"LIST.1", "LIST.2", "LIST.3"}),
#"Changed Type" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"LIST.1", type text}, {"LIST.2", type text}, {"LIST.3", type text}}),
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"GROUP"}, "Attribute", "Value"),
#"Removed Columns1" = Table.RemoveColumns(#"Unpivoted Other Columns",{"Attribute"}),
#"Removed Duplicates" = Table.Distinct(#"Removed Columns1"),
#"Sorted Rows" = Table.Sort(#"Removed Duplicates",{{"GROUP", Order.Ascending}, {"Value", Order.Ascending}}),
#"Grouped Rows" = Table.Group(#"Sorted Rows", {"GROUP"}, {{"all", each _, type table [GROUP=nullable text, Value=text]}}),
#"Added Custom" = Table.AddColumn(#"Grouped Rows", "NewList", each [all][Value]),
#"Extracted Values" = Table.TransformColumns(#"Added Custom", {"NewList", each Text.Combine(List.Transform(List.Sort(_), Text.From), ":"), type text}),
#"Removed Columns2" = Table.RemoveColumns(#"Extracted Values",{"all"}),
#"Merged Queries" = Table.NestedJoin(#"Removed Columns2", {"GROUP"}, TABLE_BY_GROUP, {"GROUP"}, "TABLE_BY_GROUP", JoinKind.LeftOuter),
#"Expanded TABLE_BY_GROUP" = Table.ExpandTableColumn(#"Merged Queries", "TABLE_BY_GROUP", {"GROUP_DATA "}, {"TABLE_BY_GROUP.GROUP_DATA "}),
#"Renamed Columns" = Table.RenameColumns(#"Expanded TABLE_BY_GROUP",{{"TABLE_BY_GROUP.GROUP_DATA ", "GROUP_DATA"}}),
#"Changed Type1" = Table.TransformColumnTypes(#"Renamed Columns",{{"GROUP", type text}, {"NewList", type text}, {"GROUP_DATA", Int64.Type}})
in
#"Changed Type1"
这是最终输出-
您可以很容易地可视化对表结果\u元素的第二个要求使用基本表表\u BY \u元素在Power Query/M中执行此操作可能是最好的,而不是DAX如果您有10行,您希望最终输出为1行/列?如果没有,请显示您的输入和输出与现在完全相同,以及您希望最终输出的方式。我将尝试将其拆分为几行。使用查询编辑器,每个值1行。。。最终的结果是,我想根据行id的切片器选择(数据示例中未显示)查看卡(或表的一行)中的值,允许多选。嗨,Alexi,谢谢,这似乎是一个有趣的解决方案。我正在一个样本上测试这个,并在查询编辑器中分割数据。我现在看到了两个问题:-它将使我的桌子大4倍:大约4x15000=60000行。可以吗我将列表创建为一个新列,但我始终拥有整个列表的所有值。关键是:如果我只过滤奇数ID,列表将不会更新。如何在我的可视化中实现这一点?谢谢,60K行就可以了。你需要让列表成为一个度量,而不是一个计算列,它才是动态的。好吧,太好了!!明天,我将尝试使用完整的数据集进行此操作。只需检查最后两点:。。。1/我需要为此创建一个额外的表,这样在拆分列中的数据(示例中未显示键)时不会破坏键的唯一性。对吗。。。2/我希望计算列考虑行上下文。如何将代码更改为考虑“组”列,并且只应使用同一组中的行进行连接?因此,您可能确实需要将其创建为一个新表,从原始表ID到新表ID之间具有一对多关系。将其作为度量值(而不是计算列)写入将允许其基于筛选器上下文进行计算。它应该会自动响应您的过滤器、切片器和您放置它的视觉所创建的上下文。您好,谢谢!嗨,我是这样做的,效果很好。嗨,谢谢这个例子。我注意到我有更复杂的现实生活数据。如果我有一个额外的名为“GROUP”的列,并且我希望对每个组进行一次连接,那么是否可以这样做。第1组有第1行和第2行,第2组有第3、4、5行?结果就像一个两行表:group1aa:BB:CC:DD;第2组AA:BB:DD:EE。是否可以使用Power Query执行此操作?谢谢。我应该在这里添加更详细的样本数据吗?或者我应该发布一个新问题吗?可能。。。请提供更多的示例数据以供理解。您好,我添加了一组更大的数据和需要查找的结果。如果您仍然认为这是可能的话,我对您使用PowerQuery的方式很感兴趣。ThanksHi@Malo,请检查我对您的新案例的另一个答案。我无法复制粘贴下面的cod://--新步骤从这里开始,因为我有错误。也许我的POwerBi的不同版本?你能告诉我一步一步的过程吗,这样我就可以在Power Query图形编辑器中重现它了?你从哪里得到的?/--新的步骤从这里开始?新代码不包含此行。如果表的确切名称为table_BY_元素,table_BY_组,所有列名如示例所示,那么只需复制和粘贴代码即可。