Google Sheets单公式实现非唯一姓名按计数降序展示
高效实现11k姓名数据的重复项计数、过滤与排序
问题说明
现有含11k条数据的Names工作表(数据范围C3:C12000),需在另一工作表中展示出现次数≥2的姓名及其计数,并按计数降序排列。当前使用的两个公式存在以下问题:
- 第一个公式会显示仅出现一次的姓名
- 第二个公式需要手动下拉复制,操作繁琐
- 整体计算卡顿甚至导致表格崩溃
解决方案
根据你使用的表格工具(Google Sheets/Excel 365),以下是单个高效公式实现方案:
方案1:Google Sheets 专用(性能最优)
使用QUERY函数嵌套,先分组计数再过滤排序:
=QUERY(QUERY(Names!C3:C12000, "SELECT Col1, COUNT(Col1) WHERE Col1 IS NOT NULL GROUP BY Col1", 0), "SELECT * WHERE Col2 >= 2 ORDER BY Col2 DESC", 1)
或者用更简洁的GROUPBY函数(需Google Sheets支持该函数):
=SORT(FILTER(GROUPBY(Names!C3:C12000, Names!C3:C12000, COUNT, 0), INDEX(GROUPBY(Names!C3:C12000, Names!C3:C12000, COUNT, 0),,2)>=2), 2, FALSE)
方案2:Excel 365/2021 专用(动态数组)
用LET函数封装计算逻辑,减少重复计算:
=LET( 姓名列, Names!C3:C12000, 非空姓名, FILTER(姓名列, 姓名列<>""), 唯一姓名, UNIQUE(非空姓名), 计数, COUNTIF(非空姓名, 唯一姓名), 过滤后数据, FILTER(HSTACK(唯一姓名, 计数), 计数>=2), SORT(过滤后数据, 2, -1) )
为什么这些公式更高效?
- 减少重复计算:原公式中
COUNTIF会被多次调用,新方案仅执行一次分组/计数操作 - 提前过滤无效数据:先排除空值,缩小计算范围
- 一次性输出结果:无需下拉公式,动态数组/QUERY自动填充所有符合条件的行
- 精准过滤:直接筛选出计数≥2的项,避免显示单次出现的姓名
原公式问题分析
- 第一个公式未添加计数≥2的过滤条件,导致单次出现的姓名被保留
- 第二个公式每个单元格单独执行
COUNTIF,对11k数据重复计算,极大消耗资源 - 未处理空值,增加了不必要的计算量
内容的提问来源于stack exchange,提问作者kumoyadori
相关产品推荐
相关产品推荐

