从Power查询表中获取前n个结果,其中n基于if函数是动态的

时间:2019-08-28 13:53:36

标签: powerquery m

我想使用Power Query按字段提取(字段为[Project]),然后从主表中为每个项目获取得分最高的3行,但是如果超过3行且得分超过15 ,它们都应该包括在内。每次最少必须提取3行。

基本上,我正在尝试将Keep Rows函数与我的公式“ = if(score> = 15,1,0)”

结合使用

将查询设置为分数大于15的记录不适用于分数最高的项目(例如1、7和15)。这只会返回1行,但最少需要3行。 / p>

仅将其设置为前3个得分会忽略表中最高得分分别为18、19、20的行

是否有一种方法可以将两个函数组合为“选择前3行,但是如果有n行的得分大于等于15,则选择前n行

2 个答案:

答案 0 :(得分:1)

据我了解,您尝试执行以下操作(亚历克西斯·奥尔森提出了相同的建议):

let
    Source = Excel.CurrentWorkbook(){[Name="Table"]}[Content],
    group = Table.Group(Source, {"Project"}, {"temp", each Table.SelectRows(Table.AddIndexColumn(Table.Sort(_, {"Score", 1}), "i", 1, 1), each [i]<=3 or [Score]>=15)}),
    expand = Table.ExpandTableColumn(group, "temp", {"Score"})
in
    expand

或者:

let
    Source = Excel.CurrentWorkbook(){[Name="Table"]}[Content],
    group = Table.Group(Source, {"Project"}, {"temp", each [a = Table.Sort(_, {"Score", 1}), b = Table.FirstN(a, 3) & Table.SelectRows(Table.Skip(a,3), each [Score]>=15)][b]}),
    expand = Table.ExpandTableColumn(group, "temp", {"Score"})
in
    expand

或者:

let
    Source = Excel.CurrentWorkbook(){[Name="Table"]}[Content],
    group = Table.Group(Source, {"Project"}, {"Score", each [a = List.Sort([Score], 1), b = List.FirstN(a,3)&List.Select(List.Skip(a,3), each _ >=15)][b]}),
    expand = Table.ExpandListColumn(group, "Score")
in
    expand

请注意,如果要保留的表中有更多列,则对于第一和第二个变体,您可以将这些列添加到最后一步。对于最后一个变体,您没有这种选择,应该修改代码。

答案 1 :(得分:0)

Score列的降序排列,然后添加Index列(转到“添加列”>“索引列”>“从1开始”)。

然后在Index列上的过滤器中选择将值保留为小于或等于3。这将使用以下M代码产生一个步骤:

= Table.SelectRows(#"Added Index", each [Index] <= 3)

现在,您只需要稍作调整即可将15分或更高的分数也包括在内:

= Table.SelectRows(#"Added Index", each [Index] <= 3 or [Score] >= 15)