电源查询筛选器每年的前 N ​​个值

powerquery filter TopN values for each year

我有每个国家和每年的数据集。

问题:我想用 PowerQuery 过滤每年的 topN 总金额。

我只能用这个代码得到一年的结果,但我需要一个列表中包含前 10(N) 个的所有年份的数据。

let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Export Country", type text}, {"Gross Export", Int64.Type}, {"Share", type number}, {"Year", Int64.Type}, {"Imp/Exp", type text}}),
#"Sorted Rows" = Table.Sort(#"Changed Type",{{"Year", Order.Ascending}, {"Gross Export", Order.Descending}}),
#"Kept First Rows" = Table.FirstN(#"Sorted Rows",10) 
in #"Kept First Rows"

解决方法:我分别为每年创建列表,然后将它们合并,但这是一个漫长的过程。 sheet "Export_Top10"

中的预期结果

感谢您的帮助。

Data File

下面是按 [Year] 分组,然后在每个组内按 [Amount] 排序并添加索引的示例。然后您展开数据并过滤您要查找的前 X [Amount] 数字的索引。在代码中,我选择了前 10 名,在图像中,前 3 名

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Year", Int64.Type}, {"Amount", Int64.Type}}),
#"Grouped Rows" = Table.Group(#"Changed Type", {"Year"}, {{"All", each Table.AddIndexColumn(Table.Sort(_,{{"Amount", Order.Descending}}),"Index",1,1), type table}}),
#"Expanded All" = Table.ExpandTableColumn(#"Grouped Rows", "All", {"Amount", "Index"}, {"Amount", "Index"}),
#"Filtered Rows" = Table.SelectRows(#"Expanded All", each ([Index] < 11))
in  #"Filtered Rows"

样本 before/after 挑选前 3 名:

这是另一种方法,也涉及分组。

但是,我没有对整个子表进行排序并添加索引列,而是对总出口列表进行排序,Select 仅对总出口 >= 第十高的那些行进行排序。

请注意,如果 并列 ,此方法将 return 所有 行。因此,如果两个国家在给定年份的出口额并列,则可能有 11 行 returned 而不是 10.

let
    Source = #"Table1 (3)",

//Group by year and extract top 10
    #"Grouped Rows" = Table.Group(Source, {"Year"}, {
        {"Top Ten", (t)=> Table.SelectRows(t, each [Gross Export]> List.Sort(t[Gross Export],Order.Descending){10})}}),

//remove year column since we will expand it in the correct order in next step
    #"Removed Columns" = Table.RemoveColumns(#"Grouped Rows",{"Year"}),

//expand the top ten table
    #"Expanded Top Ten" = Table.ExpandTableColumn(#"Removed Columns", "Top Ten", 
        {"Export Country", "Gross Export", "Share", "Year", "Imp/Exp"}, {"Export Country", "Gross Export", "Share", "Year", "Imp/Exp"})
in
    #"Expanded Top Ten"

示例结果仅显示前 3

在@horseyride 的帮助下我找到了解决方案

let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Export Country", type text}, {"Gross Export", Int64.Type}, {"Share", type number}, {"Year", Int64.Type}, {"Imp/Exp", type text}}),
#"Grouped Rows" = Table.Group(#"Changed Type", {"Year"}, {{"All", each Table.AddIndexColumn(Table.Sort(_,{{"Gross Export", Order.Descending}}),"Index",1,1), type table}}),
#"Expanded All" = Table.ExpandTableColumn(#"Grouped Rows", "All", {"Export Country", "Gross Export", "Share", "Imp/Exp", "Index"}, {"Export Country", "Gross Export", "Share", "Imp/Exp", "Index"}),
#"Changed Type1" = Table.TransformColumnTypes(#"Expanded All",{{"Gross Export", type number}, {"Share", Percentage.Type}}),
#"Filtered Rows" = Table.SelectRows(#"Changed Type1", each [Index] <= 10),
#"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Index"})
in
#"Removed Columns"