Excel文件在网盘里https://pan.baidu.com/s/136GY27Gdnf4F8d2yyomtHw
查找条件:如2018年第1组中,B对I这行,首先看后三组,即第2组中O对B,第3组中B对C,第四组中G对B。然后查找O对B在2018年第1组之前的最近对比,即2017年第37组中的O对B,查找B对C在2018年第1组之前的最近对比,即2017年第25组C对B,查找G对B在2018年第1组之前的最近对比,即2017年第24组G对B,将查找后的三组结果返回到2018年B对I后面。
Excel文件在网盘里https://pan.baidu.com/s/136GY27Gdnf4F8d2yyomtHw
查找条件:如2018年第1组中,B对I这行,首先看后三组,即第2组中O对B,第3组中B对C,第四组中G对B。然后查找O对B在2018年第1组之前的最近对比,即2017年第37组中的O对B,查找B对C在2018年第1组之前的最近对比,即2017年第25组C对B,查找G对B在2018年第1组之前的最近对比,即2017年第24组G对B,将查找后的三组结果返回到2018年B对I后面。
名称1和名称2合并,然后分组,每组取{0},是这个意思?
是这个意思吗?
2017第37组,未来三组是38和2018的1,2,然后查找2017第37组之前的数据
2018第1组,未来三组是2,3,4,然后查找2018第1组之前的数据,就是2017年的数据
2018第2组,未来三组是3,4,5,然后查找2018第2组之前的数据,就是2018第1组+2017年的数据
2018第3组,未来三组是4,5,6,然后查找2018第3组之前的数据,就是2018第1、2组+2017年的数据
......
那你试试吧,看运行结果是不是你想要的。由于使用了Table.SelectRows,所以效率欠佳,加载到表有点慢。
先把工作表中前五列所在的数据区域Ctrl+T变成表,表名为“表1”,导入PQ,进入高级编辑器,先清空,再把以下语句贴入:
let
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
变 = Table.SplitColumn(
Table.AddColumn( 源,"a",each let p = Table.PositionOf(源,_),
l = {Table.Buffer(Table.Range(源,0,p)),Table.Buffer(Table.Range(源,p+1))}
in List.Combine(
Table.TransformRows(
Table.Range(
Table.SelectRows( l{1},
(x)=>List.Contains({x[名称1],x[名称2]},[名称1]))
,0,3),
each Record.ToList(
Table.Last(
Table.SelectRows( l{0},
(x)=> List.ContainsAll({x[名称1],x[名称2]},{[名称1],[名称2]}))
,[] ) ))) )
,"a",each _,15)
in
变
@eXcellent
《一会O对B,B对C,G对B, 一会你的表格里给出的又是O-B,C-B,G-B》
确实是这样的,有时O-B,有时B-O,顺序是不一定的,所以才有难度。蓝底色的例子只是一部分,整体还要更复杂。
你的题 其实就是个反复筛选的过程, 根据不同条件分好步骤, 再不断将筛选函数加以组合。
第1步, 根据当前行的名称1 去筛选比当前行的年份和分组 大的前3行;
第2步, 对第1步取得的每一行, 根据其 名称1-名称2 的组合 去取得比当前行的年份和分组 小, 且 相同名称组合 的最后一行;
第3步, 将第2步取得的每一行 与当前行合并。
所以, 只要厘清条件和筛选的思绪, 又对DAX公式熟悉(M也如此), 本题不难.
详见我的文章