Max Power Query Assistance:如何返回所有字段中具有最高值的行中三个连续字段的范围

Max Power Query Assistance:如何返回所有字段中具有最高值的行中三个连续字段的范围,max,powerquery,Max,Powerquery,新能源查询。把我现在所需要的东西拼凑起来 我需要返回一系列单元格中具有最高值的三个连续单元格的总和。以我提供的屏幕截图为例。这不一定包括给定范围内特定单元格的最大值 我可以在一个有MAX函数和重叠数组的电子表格中整天这样做。虽然我非常确定这个列表,但我似乎无法用Power Query解决这个问题。Max不知何故也会参与其中 谢谢你的帮助 3月23日编辑: 我已经修改并尝试了这两个代码建议,但是第一个建议的代码运行了很长时间(我在一小时后将其删除),或者第二个建议错误找不到“Material 1

新能源查询。把我现在所需要的东西拼凑起来

我需要返回一系列单元格中具有最高值的三个连续单元格的总和。以我提供的屏幕截图为例。这不一定包括给定范围内特定单元格的最大值

我可以在一个有MAX函数和重叠数组的电子表格中整天这样做。虽然我非常确定这个列表,但我似乎无法用Power Query解决这个问题。Max不知何故也会参与其中

谢谢你的帮助

3月23日编辑: 我已经修改并尝试了这两个代码建议,但是第一个建议的代码运行了很长时间(我在一小时后将其删除),或者第二个建议错误找不到“Material 1”列(我在截图中重命名了“Part Number”字段)

我没有提到我的数据表有超过20k行。我在解释你们提供的m代码建议时遇到了困难,但它们是否一行一行地循环?也许这就是造成滞后的原因。也许我最好使用VBA在Power查询之前准备表格,方法是在一个新的列中输入/填充一个公式,然后查找MAX(B1:N^1+C1:N^2+D1:N^3)?看起来在这种情况下可能会更快

这两个代码建议的我的版本:

第一种方法:

let
Source = Excel.CurrentWorkbook(){[Name="tblSource"]}[Content],
#"Promoted Headers" = Table.PromoteHeaders(Source),
#"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Material 1", type text}, {"Sold Month 1", Int64.Type}, {"Sold Month 2", Int64.Type}, {"Sold Month 3", Int64.Type}, {"Sold Month 4", Int64.Type}, {"Sold Month 5", Int64.Type}, {"Sold Month 6", Int64.Type}, {"Sold Month 7", Int64.Type}, {"Sold Month 8", Int64.Type}, {"Sold Month 9", Int64.Type}, {"Sold Month 10", Int64.Type}, {"Sold Month 11", Int64.Type}, {"Sold Month 12", Int64.Type}}),

#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type",{"Material 1"}, "Attribute", "Value"),
#"Added Index" = Table.AddIndexColumn(#"Unpivoted Other Columns", "Index", 0, 1),
#"Reordered Columns" = Table.ReorderColumns(#"Added Index",{"Index", "Material 1", "Attribute", "Value"}),
#"Added Custom" = Table.AddColumn(#"Reordered Columns" ,"Sum",(i)=>
    List.Sum(Table.SelectRows(#"Reordered Columns", each [Material 1]=i[Material 1] and [Index]=i[Index]) [Value])+
    List.Sum(Table.SelectRows(#"Reordered Columns", each [Material 1]=i[Material 1] and [Index]=i[Index]+1) [Value])+
    List.Sum(Table.SelectRows(#"Reordered Columns", each [Material 1]=i[Material 1] and [Index]=i[Index]+2) [Value])
    , type number),
#"Grouped Rows" = Table.Group(#"Reordered Columns", {"Material 1"}, {{"Max", each List.Max([Sum]), type number}}),
// Merge the max into the original table
#"Merged Queries" = Table.NestedJoin(#"Grouped Rows", {"Material 1"}, #"Grouped Rows",{"Material 1"},"Table1",JoinKind.LeftOuter),
#"Expanded Table1" = Table.ExpandTableColumn(#"Merged Queries", "Table1", {"Max"}, {"Max2"})
in #"Expanded Table1"`
第二种方法:

let
Source = Excel.CurrentWorkbook(){[Name="tblSource"]}[Content],
#"Promoted Headers" = Table.PromoteHeaders(Source),
#"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Material 1", type text}, {"Sold Month 1", Int64.Type}, {"Sold Month 2", Int64.Type}, {"Sold Month 3", Int64.Type}, {"Sold Month 4", Int64.Type}, {"Sold Month 5", Int64.Type}, {"Sold Month 6", Int64.Type}, {"Sold Month 7", Int64.Type}, {"Sold Month 8", Int64.Type}, {"Sold Month 9", Int64.Type}, {"Sold Month 10", Int64.Type}, {"Sold Month 11", Int64.Type}, {"Sold Month 12", Int64.Type}}),
i = {"i"}, k = {"Material 1"},
base = Table.UnpivotOtherColumns(#"Changed Type", k, "Col", "Val"),
f = (n)=>let x = Table.Group(base, k, {"t", each Table.AddIndexColumn(_, "i", n)})
         in Table.Combine(x[t]),
a = f(0),
b = f(1),
c = f(2),
join = Table.NestedJoin(Table.NestedJoin(a,i&k,b,i&k,"a"),i&k,c,i&k,"b"),
add = Table.AddColumn(join, "sum", each List.Sum({[Val],[a][Val]{0}?,[b][Val]{0}?})),
group = Table.Group(add, k, {"max", each List.Max([sum])}),
final = Table.Join(Source, k, group, k)
在下面的最终示例代码中

主要技巧是取消PIVOT,然后使用自定义列和索引添加当前行、下一行和下一行+1行(如果它们是相同的零件号)

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Part Number", type text}}),
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type" , {"Part Number"}, "Attribute", "Value"),
#"Added Index" = Table.AddIndexColumn(#"Unpivoted Other Columns", "Index", 0, 1),
#"Added Custom" = Table.AddColumn(#"Added Index" ,"Sum",(i)=>
    List.Sum(Table.SelectRows(#"Added Index" , each [Part Number]=i[Part Number] and [Index]=i[Index]) [Value])+
    List.Sum(Table.SelectRows(#"Added Index" , each [Part Number]=i[Part Number] and [Index]=i[Index]+1) [Value])+
    List.Sum(Table.SelectRows(#"Added Index" , each [Part Number]=i[Part Number] and [Index]=i[Index]+2) [Value])
    , type number),
#"Grouped Rows" = Table.Group(#"Added Custom", {"Part Number"}, {{"Max", each List.Max([Sum]), type number}}),

// Merge the max into the original table
#"Merged Queries" = Table.NestedJoin(#"Changed Type",{"Part Number"}, #"Grouped Rows",{"Part Number"},"Table1",JoinKind.LeftOuter),
#"Expanded Table1" = Table.ExpandTableColumn(#"Merged Queries", "Table1", {"Max"}, {"Max"})
in #"Expanded Table1"
下面是示例代码

主要技巧是取消PIVOT,然后使用自定义列和索引添加当前行、下一行和下一行+1行(如果它们是相同的零件号)

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Part Number", type text}}),
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type" , {"Part Number"}, "Attribute", "Value"),
#"Added Index" = Table.AddIndexColumn(#"Unpivoted Other Columns", "Index", 0, 1),
#"Added Custom" = Table.AddColumn(#"Added Index" ,"Sum",(i)=>
    List.Sum(Table.SelectRows(#"Added Index" , each [Part Number]=i[Part Number] and [Index]=i[Index]) [Value])+
    List.Sum(Table.SelectRows(#"Added Index" , each [Part Number]=i[Part Number] and [Index]=i[Index]+1) [Value])+
    List.Sum(Table.SelectRows(#"Added Index" , each [Part Number]=i[Part Number] and [Index]=i[Index]+2) [Value])
    , type number),
#"Grouped Rows" = Table.Group(#"Added Custom", {"Part Number"}, {{"Max", each List.Max([Sum]), type number}}),

// Merge the max into the original table
#"Merged Queries" = Table.NestedJoin(#"Changed Type",{"Part Number"}, #"Grouped Rows",{"Part Number"},"Table1",JoinKind.LeftOuter),
#"Expanded Table1" = Table.ExpandTableColumn(#"Merged Queries", "Table1", {"Max"}, {"Max"})
in #"Expanded Table1"

稍微不同的方式:

let
    Source = Excel.CurrentWorkbook(){[Name="Table"]}[Content],
    i = {"i"}, k = {"Part Number"},
    base = Table.UnpivotOtherColumns(Source, k, "Col", "Val"),
    f = (n)=>let x = Table.Group(base, k, {"t", each Table.AddIndexColumn(_, "i", n)})
             in Table.Combine(x[t]),
    a = f(0),
    b = f(1),
    c = f(2),
    join = Table.NestedJoin(Table.NestedJoin(a,i&k,b,i&k,"a"),i&k,c,i&k,"b"),
    add = Table.AddColumn(join, "sum", each List.Sum({[Val],[a][Val]{0}?,[b][Val]{0}?})),
    group = Table.Group(add, k, {"max", each List.Max([sum])}),
    final = Table.Join(Source, k, group, k)
in
    final

稍微不同的方式:

let
    Source = Excel.CurrentWorkbook(){[Name="Table"]}[Content],
    i = {"i"}, k = {"Part Number"},
    base = Table.UnpivotOtherColumns(Source, k, "Col", "Val"),
    f = (n)=>let x = Table.Group(base, k, {"t", each Table.AddIndexColumn(_, "i", n)})
             in Table.Combine(x[t]),
    a = f(0),
    b = f(1),
    c = f(2),
    join = Table.NestedJoin(Table.NestedJoin(a,i&k,b,i&k,"a"),i&k,c,i&k,"b"),
    add = Table.AddColumn(join, "sum", each List.Sum({[Val],[a][Val]{0}?,[b][Val]{0}?})),
    group = Table.Group(add, k, {"max", each List.Max([sum])}),
    final = Table.Join(Source, k, group, k)
in
    final

如果已经有索引,请删除我的#“添加的索引”行,并将接下来的几行更改为在所有实例中使用先前的步骤名称,而不是#“添加的索引”。或者添加另一个索引并将引用更改为#“Added Index2”谢谢。我试过了,但一直挂着。请参阅我的帖子编辑。我想我将不得不使用VBA来输入数组公式,除非您看到任何明显的错误?非常感谢您的帮助。如果您已经有索引,请删除我的#“添加索引”行,并在所有情况下将接下来的几行更改为使用先前的步骤名称,而不是#“添加索引”。或者添加另一个索引并将引用更改为#“Added Index2”谢谢。我试过了,但它总是挂断。请参阅我的帖子编辑。我想我将不得不使用VBA来输入数组公式,除非您看到任何明显的错误?谢谢你的帮助,谢谢。我试过了,但总是出错。请参阅我的帖子编辑。我想我将不得不使用VBA来输入数组公式,除非您看到任何明显的错误?谢谢你的帮助。代码运行得很好。在最后一步中,您已经参考了源表。但您尚未升级标题,因此在这一步中没有“Material 1”列。此外,您还更改了类型-根据“Material 1”列的内容,您可能会在最后一步得到空表。因此,您应该只替换最后一步中的第一个表:final=table.Join(#“Changed Type”,k,group,k)谢谢。我试过了,但总是出错。请参阅我的帖子编辑。我想我将不得不使用VBA来输入数组公式,除非您看到任何明显的错误?谢谢你的帮助。代码运行得很好。在最后一步中,您已经参考了源表。但您尚未升级标题,因此在这一步中没有“Material 1”列。此外,您还更改了类型-根据“Material 1”列的内容,您可能会在最后一步得到空表。因此,您应该只替换最后一步中的第一个表:final=table.Join(#“Changed Type”,k,group,k)