使用Google Sheets Query获取数据行的最大日期
解决Google Sheets Query提取特定名称最新数据(含F列)的问题
我完全明白你遇到的这个痛点——用Google Sheets Query处理最新数据的时候,一旦涉及到非聚合的列,很容易碰到这种要么报错要么带出多余数据的问题。先帮你还原场景,再拆解原因,最后给出可行的解决方案。
场景还原
先假设你的原始数据是这样的(A到F列):
| Name | Date | ColC | ColD | ColE | ColF |
|---|---|---|---|---|---|
| Mark | 4/1/17 | 100 | 200 | 300 | X |
| Mark | 5/1/17 | 150 | 250 | 350 | Y |
| Sarah | 3/1/17 | 400 | 500 | 600 | Z |
| Sarah | 6/1/17 | 450 | 550 | 650 | W |
你的期望输出是每个Name对应最新Date的整行数据(包含F列):
| Name | Date | ColC | ColD | ColE | ColF |
|---|---|---|---|---|---|
| Mark | 5/1/17 | 150 | 250 | 350 | Y |
| Sarah | 6/1/17 | 450 | 550 | 650 | W |
问题原因拆解
你之前遇到的两个问题,本质是Google Sheets Query的GROUP BY规则导致的:
- 当你把F列加入
SELECT但没放进GROUP BY时,Query会报错——因为SQL逻辑要求:所有未使用聚合函数(比如max()、min())的列,必须出现在GROUP BY子句里。F列没有被聚合,所以必须加入分组,否则Query不知道该如何处理同一组内的不同F值。 - 如果你把F列加入
GROUP BY,那么分组逻辑会变成「Name + F列值」的组合。Mark的两行F列分别是X和Y,属于不同的分组,所以都会被保留,这就违背了你只留最新日期行的需求。
可行解决方案
这里给你两种常用的解决思路,都能完美获取包含F列的最新行数据:
方法1:用VLOOKUP+SORT快速实现
这种方法无需复杂的Query逻辑,利用排序+查找的组合,直接定位每个Name的最新行:
=ARRAYFORMULA(VLOOKUP(UNIQUE(A2:A), SORT(A:F, 2, FALSE), {1,2,3,4,5,6}, FALSE))
- 解释:
SORT(A:F, 2, FALSE):把原始数据按Date列(第2列)降序排列,这样每个Name的最新行会排在最前面;UNIQUE(A2:A):提取所有不重复的Name;VLOOKUP:找到每个Name在排序后数据里的第一个匹配项,也就是最新日期的行,返回所有6列的数据。
方法2:用Query子查询实现更灵活的筛选
如果你更习惯用Query,可以结合子查询先获取每个Name的最新日期,再关联原数据筛选出对应行:
=QUERY(A:F, "select * where (A,B) in (select A, max(B) from A:F group by A)", 1)
- 解释:
- 子查询
select A, max(B) from A:F group by A:先获取每个Name对应的最大(最新)Date; - 主查询
select * where (A,B) in (...):筛选出Name和Date同时匹配子查询结果的行,这样就能得到每个Name最新日期的完整行,包括F列。
- 子查询
内容的提问来源于stack exchange,提问作者Harrison
相关产品推荐
相关产品推荐

