Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powerbi Power M函数返回列的最常用字符串,作为Table.Group aggregate子句的一部分_Powerbi_M - Fatal编程技术网

Powerbi Power M函数返回列的最常用字符串,作为Table.Group aggregate子句的一部分

Powerbi Power M函数返回列的最常用字符串,作为Table.Group aggregate子句的一部分,powerbi,m,Powerbi,M,我编写了一个自定义聚合函数,用于为一组具有唯一分组的记录返回一个或多个列的最常见值:即,可以在可能使用MAX、MIN等的位置使用,但结果是最常见的值。 有人能提供更好或更高性能的解决方案吗?这是我的第一个M函数。或者自由适应 功能如果在第G1列上分组并在第A1列上聚合,第一个表作为输入数据,则第二个表作为输出 函数最常见 let fnMostCommon = (ListIn) => let uniquevalues=List.Distinct(ListIn)

我编写了一个自定义聚合函数,用于为一组具有唯一分组的记录返回一个或多个列的最常见值:即,可以在可能使用MAX、MIN等的位置使用,但结果是最常见的值。 有人能提供更好或更高性能的解决方案吗?这是我的第一个M函数。或者自由适应

功能如果在第G1列上分组并在第A1列上聚合,第一个表作为输入数据,则第二个表作为输出

函数最常见

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,这绝对是一个好主意)。我想它会快一点,但你真的需要在实践中测试它才能确定。