You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用动态公式提取特定类别对应的最后5个价格(不足则返回全部)

问题需求

给定如下样本数据(按日期升序排列):

DateCategoryPriceQuantity
02-01-2019BASE_Y-202791
02-01-2019BASE_Y-21271.250
03-01-2019BASE_Y-20276.52
03-01-2019BASE_Y-21266.50
04-01-2019BASE_Y-20272.8814
04-01-2019BASE_Y-21266.51
07-01-2019BASE_Y-20270.4829
07-01-2019BASE_Y-21262.750
08-01-2019BASE_Y-202704
08-01-2019BASE_Y-212640
09-01-2019BASE_Y-20270.0631
09-01-2019BASE_Y-21262.850

需要编写动态公式,提取BASE_Y-20类别对应的最后5个价格:

  • 当该类别价格数量≥5时,返回最新的5个(按日期从新到旧排序)
  • 当数量<5时,返回所有存在的价格

已尝试SUMPRODUCT和OFFSET组合,但未成功实现需求。


解决方案

方案1:Excel 365/2021 动态数组公式

直接使用FILTER+TAKE组合,简洁高效:

=TAKE(SORT(FILTER(C2:C13,B2:B13="BASE_Y-20",""),1,-1),5)

公式解析:

  1. FILTER(C2:C13,B2:B13="BASE_Y-20",""):筛选出所有BASE_Y-20对应的价格
  2. SORT(...,1,-1):将筛选结果按原数据行号倒序排序(原数据日期升序,倒序后最新数据在前)
  3. TAKE(...,5):提取前5个结果,若筛选结果不足5个则返回全部

方案2:兼容旧版Excel的公式(非动态数组)

如果使用旧版Excel,可结合INDEX+SMALL+IF实现,需按Ctrl+Shift+Enter作为数组公式输入:

=INDEX(C:C,SMALL(IF(B$2:B$13="BASE_Y-20",ROW(B$2:B$13)),COUNTIF(B$2:B$13,"BASE_Y-20")-ROW(A1)+1))

使用说明:

  1. 在空白单元格输入公式,按Ctrl+Shift+Enter确认
  2. 下拉公式,直到出现#NUM!错误值为止,有效结果即为所需的最后5个价格
  3. 若BASE_Y-20的价格数量不足5个,下拉对应次数后就会出现错误值,前几个结果即为全部数据

公式解析:

  1. IF(B$2:B$13="BASE_Y-20",ROW(B$2:B$13)):返回所有BASE_Y-20对应行的行号,其他行返回FALSE
  2. COUNTIF(B$2:B$13,"BASE_Y-20"):统计BASE_Y-20的价格总数
  3. SMALL(...,COUNTIF(...) - ROW(A1)+1):从大到小提取行号(即最新的行在前)
  4. INDEX(C:C,...):根据行号提取对应价格

内容的提问来源于stack exchange,提问作者Zam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:01:28