Excel O365:基于两列去重、排序并关联提取完整数据的非VBA方案
按姓名+工艺去重并保留最新记录的Excel公式方案
核心解决方案(兼容多数Excel 365版本)
用LET函数整合多步骤逻辑,避免重复计算,最终输出包含姓名、工艺、订单号、日期的完整最新记录:
=LET( rawData, FILTER(WelderQualifications[[Employee Name]:[Date Performed]], {1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1}), nameCraft, CHOOSECOLS(rawData, 1, 2), dates, CHOOSECOLS(rawData, 4), uniqueGroups, UNIQUE(nameCraft), latestDates, BYROW(uniqueGroups, LAMBDA(x, MAX(FILTER(dates, (INDEX(nameCraft,,1)=INDEX(x,1))*(INDEX(nameCraft,,2)=INDEX(x,2)))))), FILTER(rawData, BYROW(rawData, LAMBDA(row, (INDEX(row,1)&INDEX(row,2)&INDEX(row,4))=XLOOKUP(INDEX(row,1)&INDEX(row,2), BYROW(uniqueGroups, LAMBDA(y, INDEX(y,1)&INDEX(y,2))), BYROW(HSTACK(uniqueGroups, latestDates), LAMBDA(z, INDEX(z,1)&INDEX(z,2)&INDEX(z,3)))))) )
公式拆解
rawData:复用你原有的FILTER公式,提取目标4列数据nameCraft:提取前两列(姓名+工艺)作为去重分组的唯一依据dates:单独提取日期列,用于筛选每组的最新记录uniqueGroups:生成姓名+工艺的所有唯一组合latestDates:针对每个唯一组合,筛选出对应组的所有日期并取最大值(即最新日期)- 最终FILTER:遍历原始数据的每一行,通过拼接姓名+工艺+日期,匹配对应唯一组合的姓名+工艺+最新日期,留下符合条件的完整行
简化方案(仅适用于Excel 365最新版本,支持GROUPBY函数)
如果你的Excel支持GROUPBY函数,公式可以更简洁:
=LET( rawData, FILTER(WelderQualifications[[Employee Name]:[Date Performed]], {1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1}), GROUPBY(CHOOSECOLS(rawData,1,2), rawData, LAMBDA(x, XLOOKUP(MAX(CHOOSECOLS(x,4)), CHOOSECOLS(x,4), x)), 0, 0) )
逻辑说明
- 按姓名+工艺(前两列)分组
- 对每组数据,用
MAX找到最新日期,再通过XLOOKUP定位到该日期对应的完整行 - 最后输出所有分组的最新完整记录
注意事项
- 确保日期列是标准日期格式(不是文本),否则
MAX函数无法正确识别先后顺序 - 如果同一姓名+工艺下存在多条相同最新日期的记录,上述公式会保留所有匹配行;若需仅保留一条,可在XLOOKUP中添加额外判断条件(比如取最小订单号)
内容的提问来源于stack exchange,提问作者Muffinman
相关产品推荐
相关产品推荐

