Powerbi Power M函数返回列的最常用字符串,作为Table.Group aggregate子句的一部分
我编写了一个自定义聚合函数,用于为一组具有唯一分组的记录返回一个或多个列的最常见值:即,可以在可能使用MAX、MIN等的位置使用,但结果是最常见的值。 有人能提供更好或更高性能的解决方案吗?这是我的第一个M函数。或者自由适应 功能如果在第G1列上分组并在第A1列上聚合,第一个表作为输入数据,则第二个表作为输出 函数最常见Powerbi Power M函数返回列的最常用字符串,作为Table.Group aggregate子句的一部分,powerbi,m,Powerbi,M,我编写了一个自定义聚合函数,用于为一组具有唯一分组的记录返回一个或多个列的最常见值:即,可以在可能使用MAX、MIN等的位置使用,但结果是最常见的值。 有人能提供更好或更高性能的解决方案吗?这是我的第一个M函数。或者自由适应 功能如果在第G1列上分组并在第A1列上聚合,第一个表作为输入数据,则第二个表作为输出 函数最常见 let fnMostCommon = (ListIn) => let uniquevalues=List.Distinct(ListIn)
let
fnMostCommon = (ListIn) =>
let
uniquevalues=List.Distinct(ListIn),
result=Table.FromList(uniquevalues,null,{"u"}),
result2=Table.AddColumn(result ,"freq", each List.Count(List.PositionOf(ListIn, [u], 100))),
result3 = Table.Sort(result2,{{"freq", Order.Descending},{"u",Order.Ascending}}),
result4 = List.First(result3[u])
in result4
in fnMostCommon
创建数据并运行的代码:
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WSlTSUQozhBCxOlC+ETa+EZifhKY+CU19MpAJRGUm6LxYAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [G1 = _t, A1 = _t, A2 = _t]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"G1", type text}, {"A1", type text}, {"A2", type text}}),
#"Grouped Rows" = Table.Group(#"Changed Type", {"G1"}, {{"Agg", each MostCommon([A1]), type text}, {"Agg2", each AllConcat([A1]), type text}}),
#"Removed Columns" = Table.RemoveColumns(#"Grouped Rows",{"Agg2"})
在
#“删除的列”这个怎么样
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WSlTSUQozVIrVgTKN0JlJCAVJCNFkIBOJEQsA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [G1 = _t, A1 = _t]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"G1", type text}, {"A1", type text}}),
#"Grouped Rows" = Table.Group(#"Changed Type", {"G1"}, {{"Count", each Table.First(Table.Sort(Table.Group(_, "A1", {"Count", List.Count}), {"Count"}))[A1], type text}})
in
#"Grouped Rows"
所有的事情都在最后一步处理,我在下面展开了这一步:
Table.Group(
#"Changed Type",
{"G1"},
{{
"Count",
each Table.First(
Table.Sort(
Table.Group(_, "A1", {"Count", List.Count}),
{"Count"}
)
)[A1],
type text
}}
)
这将按G1
列进行分组,对于每个G1
值,它将使用每个A1
值和该值出现的计数计算一个分组表。即,a
行的分组表为
A1 Count
---------
V1 1
V2 2
然后它按计数排序(
Table.Sort
),选择顶行(Table.First
),并返回[A1]
列中的值,即a
行示例中的V2
。谢谢。我估计按计数排序需要降序。为了与我的函数一致,也按A1排序。你知道它是否比功能更有效吗?我更喜欢可读性函数——MostCommon只是变成了另一个聚合函数,就像MAX一样。但是如果默认为降序,它确实需要是quickSort。如果愿意,您当然可以像以前一样将聚合分解成单独的函数(如果您想多次使用if,这绝对是一个好主意)。我想它会快一点,但你真的需要在实践中测试它才能确定。