我想使用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行
答案 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)