Reputation: 331
I have the following table:
Order Nr Number 1 Number 2 Value
100 250 66 100
100 251 67 100
100 252 65 80
100 252 64 60
100 252 63 703
101 250 80 100
101 251 81 100
101 252 85 80
101 252 84 60
101 252 83 703
Now I would like to use Power Query to get just 1 row per Order based on the Max of Number 1 and then based on Number 2. For instance Order Nr '100'. The Max of Number 1 is 252. And the Max in this range in Number 2 ist 65. Therefore the row with Value 80 should be the result. How would you do that in Power Query?
Upvotes: 0
Views: 1989
Reputation: 60174
You can do this within the Table.Group command.
***edited because I had table headers incorrect
let
Source = Excel.CurrentWorkbook(){[Name="Table10"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{
{"Order Nr", Int64.Type}, {"Number 1", Int64.Type}, {"Number 2", Int64.Type}, {"Value", Int64.Type}}),
//Group by "Order Nr"
//Then extract Maximum Number 1 and sequential filters to get the associated values
#"Grouped Rows" = Table.Group(#"Changed Type", {"Order Nr"}, {
{"Number 1", each List.Max([Number 1]), type nullable number},
{"Result", (t)=> let
filter1 = Table.SelectRows(t, each [Number 1] = List.Max(t[Number 1])),
filter2 = Table.SelectRows(filter1, each [Number 2] = List.Max(filter1[Number 2]))
in
filter2}}),
#"Expanded Result" = Table.ExpandTableColumn(#"Grouped Rows", "Result", {"Number 2", "Value"}, {"Number 2", "Value"})
in
#"Expanded Result"
Upvotes: 2
Reputation: 4282
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Order Nr", Int64.Type}, {"Number 1", Int64.Type}, {"Number 2", Int64.Type}, {"Value", Int64.Type}}),
#"Grouped Rows" = Table.Group(#"Changed Type", {"Order Nr"}, {{"_1", each List.Max([Number 1]), type nullable number}, {"_2", each List.Max([Number 2]), type nullable number}}),
#"Merged Queries" = Table.NestedJoin(#"Grouped Rows", {"Order Nr", "_1", "_2"}, #"Changed Type", {"Order Nr", "Number 1", "Number 2"}, "Grouped Rows", JoinKind.LeftOuter),
#"Expanded Grouped Rows" = Table.ExpandTableColumn(#"Merged Queries", "Grouped Rows", {"Value"}, {"Value"}),
#"Sorted Rows" = Table.Sort(#"Expanded Grouped Rows",{{"Order Nr", Order.Ascending}})
in
#"Sorted Rows"
Upvotes: 0
Reputation: 21318
Group on Order number, return All Rows and Max of Number 1 column. Expand
Group on Order number and Number 1, return All Rows and Max of Number 2 column. Expand
Add custom column with formula as below, then filter
=if [Number 1]=[Number1Max] and [Number 2]=[Number2Max] then "keep" else "remove")
full sample code
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Grouped Rows" = Table.Group(Source, {"Order Nr"}, {{"Number1Max", each List.Max([Number 1]), type number}, {"Data", each _, type table}}),
#"Expanded Data" = Table.ExpandTableColumn(#"Grouped Rows", "Data", {"Number 1", "Number 2", "Value"}, {"Number 1", "Number 2", "Value"}),
#"Grouped Rows1" = Table.Group(#"Expanded Data", {"Order Nr", "Number 1"}, {{"Number2Max", each List.Max([Number 2]), type number}, {"Data", each _, type table}}),
#"Expanded Data1" = Table.ExpandTableColumn(#"Grouped Rows1", "Data", {"Number1Max", "Number 2", "Value"}, {"Number1Max", "Number 2", "Value"}),
#"Added Custom" = Table.AddColumn(#"Expanded Data1", "Custom", each if [Number 1]=[Number1Max] and [Number 2]=[Number2Max] then "keep" else "remove"),
#"Filtered Rows" = Table.SelectRows(#"Added Custom", each ([Custom] = "keep")),
#"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Number2Max", "Number1Max", "Custom"})
in #"Removed Columns"
Upvotes: 1