求助:如何在Google Sheets中匹配占比最高的城市?
解决Google Sheets中提取各城市最高占比完整行的问题
核心需求回顾
Sheet1的D列(Col4)是城市(存在重复),K列(Col11)是占比,需要筛选出每个城市对应占比最高的完整行,同时排除'Vision List'表F列标记为"Approved"的行。
逐个解决你遇到的问题
1. Query公式无法获取目标行的原因
你原来的Query公式仅返回城市和对应最大占比,没有关联回原表的完整行。要拿到整行数据,需先通过子查询得到每个城市的最大占比,再和过滤后的原表做关联:
=QUERY( FILTER('Sheet1'!A:M, 'Vision List'!F:F <> "Approved"), "SELECT * WHERE Col11 IN (SELECT MAX(Col11) WHERE Col4 IS NOT NULL GROUP BY Col4) GROUP BY Col4,Col1,Col2,Col3,Col5,Col6,Col7,Col8,Col9,Col10,Col12,Col13 ORDER BY Col4 ASC", 1 )
注:GROUP BY需列出所有要保留的列(除聚合列),如果列数较多,推荐用下面的Filter+Rank方法更简洁。
2. Filter报错"范围大小不匹配"的解决
报错源于'Sheet1'!A:M和'Vision List'!F:F行数不一致(一个1000行,一个999行)。解决方法是统一两个范围的行数,比如指定具体行范围,或用ARRAY_CONSTRAIN强制对齐:
=FILTER( 'Sheet1'!A:M, ARRAY_CONSTRAIN('Vision List'!F:F, ROWS('Sheet1'!A:M), 1) <> "Approved" )
3. ArrayFormula+Match仅返回一行的解决
单独用Match只会返回第一个匹配项,要遍历每个城市获取对应最大占比的行,需结合BYROW和INDEX:
=BYROW( UNIQUE(FILTER('Sheet1'!D:D, 'Vision List'!F:F <> "Approved")), LAMBDA(city, INDEX( FILTER('Sheet1'!A:M, 'Sheet1'!D:D=city, 'Vision List'!F:F <> "Approved"), MATCH(MAX(FILTER('Sheet1'!K:K, 'Sheet1'!D:D=city, 'Vision List'!F:F <> "Approved")), FILTER('Sheet1'!K:K, 'Sheet1'!D:D=city, 'Vision List'!F:F <> "Approved"), 0) )) )
更简洁的推荐方案
用RANK.EQ给每个城市的占比排名,直接筛选排名为1的行,一步到位:
=FILTER( 'Sheet1'!A:M, 'Vision List'!F:F <> "Approved", RANK.EQ('Sheet1'!K:K, FILTER('Sheet1'!K:K, 'Sheet1'!D:D='Sheet1'!D:D, 'Vision List'!F:F <> "Approved"), 0)=1 )
这个公式会自动为每个城市的占比降序排名,筛选出排名第一(占比最高)的完整行,同时排除Approved的记录。
内容的提问来源于stack exchange,提问作者cywh
相关产品推荐
相关产品推荐

