如何在Excel中为6万行客户数据生成distinct产品列表及计数列
最简Excel实现方案(适用于Excel 365/2021,支持动态数组)
针对你6万行的Excel数据场景,推荐用以下高效函数组合,既能解决去重和排序需求,又能保证大数据量下的计算性能:
1. 计算客户购买的去重产品数量
在D2单元格输入公式,下拉填充到所有行即可:
=COUNTA(UNIQUE(FILTER(B$2:B$60001, A$2:A$60001=A2, "")))
- 拆解说明:
FILTER(B$2:B$60001, A$2:A$60001=A2, ""):精准筛选出当前客户(A2对应邮箱)的所有购买产品记录UNIQUE(...):对筛选结果去重,得到该客户实际购买过的不同产品集合COUNTA(...):统计去重后的产品总数- 用
B$2:B$60001而非B:B:限定数据范围,避免全列引用导致的冗余计算,大幅提升6万行数据的处理速度
2. 生成按时间排序的去重产品列表(竖线分隔)
在E2单元格输入公式,下拉填充到所有行:
=TEXTJOIN("|", TRUE, SORTBY(UNIQUE(FILTER(B$2:B$60001, A$2:A$60001=A2, "")), MINIFS(C$2:C$60001, A$2:A$60001=A2, B$2:B$60001=UNIQUE(FILTER(B$2:B$60001, A$2:A$60001=A2, ""))), 1))
- 拆解说明:
UNIQUE(FILTER(...)):先获取当前客户的所有去重产品MINIFS(C$2:C$60001, A$2:A$60001=A2, B$2:B$60001=...):计算每个去重产品的首次购买时间,作为排序依据SORTBY(..., ..., 1):按首次购买时间升序排序产品TEXTJOIN("|", TRUE, ...):把排序后的产品用竖线连接成字符串,TRUE参数会自动忽略空值
额外性能优化提示
- 始终指定精确的数据范围(比如
A$2:A$60001),避免使用全列引用(如A:A),减少Excel的无效计算量 - 可以把数据转为超级表(Ctrl+T),公式会自动扩展到所有行,无需手动下拉填充
针对你之前的疑问补充
- 用
FILTER时溢出:因为FILTER返回动态数组,直接输入会溢出到下方单元格;但用UNIQUE和COUNTA/TEXTJOIN包裹后,会自动处理数组结果,不会出现溢出问题 AGGREGATE结合FILTER:其实没必要采用这种复杂组合,UNIQUE+COUNT的搭配更简洁直接,且对动态数组的支持更好
内容的提问来源于stack exchange,提问作者Christopher Turnbull




