【问题标题】:powerquery filter TopN values for each year电源查询过滤每年的前 N ​​个值
【发布时间】:2021-10-29 19:21:12
【问题描述】:

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

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

我只能使用此代码获得一年的结果,但我需要一个列表中包含 top10(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"

解决方法:我分别为每一年创建了列表,然后将它们合并,但这是一个漫长的过程。工作表“Export_Top10”中的预期结果

感谢您的帮助。

Data File

【问题讨论】:

  • @JvdV 我希望我的编辑能清除更多...
  • @JvdV 我搜索了互联网并尝试了当然但找不到方法,这就是为什么我在这里发帖寻求帮助。据我所知,这个网站和这里的所有支持者都提供免费支持......
  • 查看How to Ask 带有minimal reproducible example 的问题。另一个供您阅读的有用链接是here。相应地编辑您的问题。不要只说你想要的,不要链接到外部文件,展示你研究的东西,展示你尝试过的东西,展示你卡在哪里,展示你想要的结果.....只是做更多,然后只是说你想要什么。人们会认为您只是在寻求免费服务。
  • 还有一些帖子可以用 PowerBi 解决,但没有用 PowerQuery 解决

标签: excel filter powerquery


【解决方案1】:

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

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

请注意,如果出现平局,此方法将返回所有行。因此,如果两个国家/地区在给定年份的出口并列,您可能会返回 11 行而不是 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

【讨论】:

  • 这很有趣,我从没想过这样做
  • @ron rosenfeld 谢谢你,好像有更多的行,我想这会更快,并且平局的可能性几乎为零)))
  • 我很好奇哪个更快。当你尝试时告诉我
【解决方案2】:

以下是按 [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"

挑选前 3 名之前/之后的样本:

【讨论】:

  • 感谢您的帮助!
【解决方案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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2019-07-27
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多