查找数据数组首个满足条件元素 玩家每日对应等级计算方案咨询
解决方案
推荐方案:ARRAYFORMULA + VLOOKUP 组合(无需QUERY,效率最高)
你的需求属于典型的升序区间匹配场景,VLOOKUP的近似匹配原生支持「查找小于等于目标值的最大值并返回对应列」的逻辑,完全契合你的实现思路,搭配ARRAYFORMULA可以实现一次编写自动批量计算所有天数的等级。
前置假设(可根据实际表格范围调整参数)
- 等级积分表范围:
等级表!A2:B5,A列存储等级,B列存储升级所需积分,默认已按积分升序排列 - 每日积分表范围:
日报表!A2:B,A列存储天数,B列存储当日累计积分,需在C列输出对应等级
具体公式
在日报表的C2单元格输入以下公式即可自动溢出所有天数的等级结果:
=ARRAYFORMULA(IF(B2:B="",,VLOOKUP(B2:B, {等级表!B2:B, 等级表!A2:A}, 2, TRUE)))
公式说明
{等级表!B2:B, 等级表!A2:A}:构造临时查询数组,把积分列放在第一列(满足VLOOKUP从左到右查找的规则),等级列放在第二列,无需调整原等级表的列顺序VLOOKUP(..., 2, TRUE):最后一个参数设为TRUE开启近似匹配,自动找到小于等于当日积分的最大升级积分对应的等级- 外层套
IF(B2:B="",,)是为了过滤空行,避免B列还没填数据的时候返回错误值 - 最外层的
ARRAYFORMULA让公式支持数组批量运算,不用手动下拉填充
可选方案:QUERY + ARRAYFORMULA 组合
如果你更习惯用QUERY的语法,也可以用二者组合实现,公式如下:
=ARRAYFORMULA(IF(B2:B="",,BYROW(B2:B, LAMBDA(p, QUERY(等级表!A:B, "SELECT A WHERE B <= "&p&" ORDER BY B DESC LIMIT 1", 0)))))
该方案逻辑更直观,但逐行调用QUERY的性能低于VLOOKUP方案,仅推荐数据量较小的场景使用。
结果验证
两个方案返回的结果完全符合你的预期:
| Day | Level |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 3 |
内容的提问来源于stack exchange,提问作者Eduardo Z.
相关产品推荐
相关产品推荐

