更新于 2026-07 · 作者:汪斌(老汪),制造业财务实战 · Excel BI(Power Query / Power Pivot / CUBE)
系列:Excel BI 财务建模实战课讲义(第二阶段)· Power Query / M 语言 · List
SEO focus:List.Distinct
SEO 关键词:List.Distinct,Power Query,M语言,列表去重,国际排名,中国排名,财务BP,边际贡献排名,Excel BI,经营分析
直接答案(TL;DR)
List.Distinct 用来删除列表里的重复值。财务BP做产品边际贡献排名时:先用 List.Select 筛出「比当前行更大的贡献额」,再 List.Count+1 得国际排名(并列跳号);若在计数前加一层 List.Distinct,则得中国排名(并列不跳号)。
学完 EP026 能独立完成哪三件事?
读完并跟做后,你应能独立完成:
- 在 Power Query 里用一行 M 调用
List.Distinct去重。 - 用
Table.AddColumn+ 列表套娃,给经营分析表加「国际排名」「中国排名」两列。 - 向老板一句说清:两种排名差在「并列更高档算几个坑」。
为什么财务BP必须搞懂 List.Distinct?
经营会上最常见的一张表,不是「科目余额」,而是产品 / 客户 / 车间的贡献或差异排名。
制造业现场会出现大量并列:两个 SKU 边际贡献都是 86 万、两条产线产量差异都是 −12%。Excel 的 RANK 有多种模式,老板口头说的「国内习惯」往往是并列后下一名不跳号;对标集团/外资口径时,又常要竞赛排名(跳号)。
在 Power Query 里,这两种排名不必先透视、也不必写复杂自定义函数——对「一列数字变成的列表」做筛选、去重、计数即可。List.Distinct 正是「中国排名」那一刀。
华凯精工案例里,排名表长什么样?
公司(化名):华凯精工,离散制造,做精密结构件。
角色:财务BP 陈工,每月经营分析会前要出「产品线边际贡献 TOP」。
源数据:从成本核算导出的「产品月度边际贡献明细」(已清洗成二维表)。
示例数据(单位:万元;数字为教学合成,非真实账套):
| 产品编码 | 产品线 | 边际贡献 |
|---|---|---|
| P-101 | 精密件A | 999 |
| P-102 | 精密件A | 999 |
| P-201 | 结构件B | 998 |
| P-202 | 结构件B | 998 |
| P-301 | 五金件C | 86 |
| P-302 | 五金件C | 80 |
| P-401 | 配件D | 80 |
经营会两个口径:
| 口径 | 现场说法 | 并列后下一名 | 本课对应 |
|---|---|---|---|
| 国际排名 | 竞赛排名 / 跳号 | 1、1、3… | List.Select → List.Count → +1 |
| 中国排名 | 密集排名 / 不跳号 | 1、1、2… | 中间再套 List.Distinct |
List.Distinct 本身怎么用?
答案先行:给一个列表,返回去掉重复后的新列表,保留首次出现顺序。
在 Power Query「高级编辑器」或自定义列里可直接试:
List.Distinct({"料工费", "制造费用", "料工费", "期间费用", "制造费用"})
返回:
{"料工费", "制造费用", "期间费用"}
对照表:
| 输入列表 | List.Distinct 结果 |
说明 |
|---|---|---|
{语文, 数学, 英语, 语文, 英语} |
{语文, 数学, 英语} |
教学原例的同构 |
{999, 999, 998} |
{999, 998} |
排名场景里「更高档只留一档」 |
{} |
{} |
空列表仍为空 |
这一步很薄;本课厚度在下一节的套娃排名。
国际排名(跳号)在 Power Query 里怎么一步步做?
步骤 0:准备表
- Excel → 数据 → 从表格/区域(或打开已有查询),进入 Power Query。
- 确认列名至少有:
产品编码、产品线、边际贡献(类型为数字)。 - 为方便在「源」上写公式:若查询里有「更改的类型」步骤,可先删除该步(与系列课习惯一致),让公式锚定在
源。
提示:删除「更改类型」不等于永远不要类型;排名公式写稳后,可再补类型步骤。
步骤 1:添加「国际排名」列
- 选中查询 → 添加列 → 自定义列(或高级编辑器里写
Table.AddColumn)。 - 新列名:
国际排名。 - 公式逻辑(把
源换成你的上一步步骤名,把[边际贡献]换成你的列名):
Table.AddColumn(
源,
"国际排名",
each
List.Count(
List.Select(
源[边际贡献],
(x) => x > [边际贡献]
)
) + 1
)
这段在干什么?
源[边际贡献]:整列贡献额 → 一个 List。List.Select(..., (x) => x > [边际贡献]):只留「严格大于当前行」的贡献额。List.Count(...) + 1:更高档有几个,排名就是几加一。
对示例数据:
| 边际贡献 | 严格更大的值(列表) | Count | 国际排名 |
|---|---|---|---|
| 999 | {} |
0 | 1 |
| 999 | {} |
0 | 1 |
| 998 | {999, 999} |
2 | 3 |
| 998 | {999, 999} |
2 | 3 |
| 86 | {999,999,998,998} |
4 | 5 |
| 80 | {999,999,998,998,86} |
5 | 6 |
| 80 | {999,999,998,998,86} |
5 | 6 |
并列占坑 → 跳号。这就是国际排名。
中国排名(不跳号)只要加哪一层?
步骤 2:在 Count 前插入 List.Distinct
复制国际排名列公式,改列名为 中国排名,在 List.Count 内层包上 List.Distinct:
Table.AddColumn(
源,
"中国排名",
each
List.Count(
List.Distinct(
List.Select(
源[边际贡献],
(x) => x > [边际贡献]
)
)
) + 1
)
对 998 这一行:
| 步骤 | 结果 |
|---|---|
List.Select 后 |
{999, 999} |
List.Distinct 后 |
{999} |
List.Count + 1 |
2 |
对照:
| 边际贡献 | 国际排名 | 中国排名 |
|---|---|---|
| 999 | 1 | 1 |
| 999 | 1 | 1 |
| 998 | 3 | 2 |
| 998 | 3 | 2 |
| 86 | 5 | 3 |
| 80 | 6 | 4 |
| 80 | 6 | 4 |
一句话记住:中国排名 = 国际排名的算法 +「更高档先去重再计数」。
套娃公式该从哪一层开始读?
从内往外读,不要一次吞整坨:
源[边际贡献]
→ List.Select(只要比我大的)
→ List.Distinct(可选:并列更高档只留一档) ← 有它=中国;无它=国际
→ List.Count
→ +1
| 你已经会的「表操作」 | 对应的「列表操作」 |
|---|---|
| 筛选行 | List.Select |
| 删除重复项 | List.Distinct |
| 计数 | List.Count |
大同小异:对象从「整张表」换成「一列抽出来的 List」。
上会前财务BP要自检哪四项?
做完排名列后,上会前自检:
- 口径写进表头或备注:本月看板用的是国际还是中国?避免老板口头「按国内习惯」却出了跳号表。
- 并列是否合理:贡献额是否先四舍五入到万元?未圆整会导致「伪不并列」。
- 是否应用在正确度量:边际贡献、产量差异、材料价差——换列名即可,公式骨架不变。
- 下游:需要进 Power Pivot / CUBE 报表时,把排名列随查询加载;或仅在 PQ 出分析表,CUBE 看板另做。
本课和前后 List 课如何衔接?
| 能力 | 本课角色 |
|---|---|
List.Select / 列表筛选 |
排名的「筛出更高档」 |
List.Count / 列表计数 |
排名的「数坑」 |
List.Distinct |
中国排名的关键一刀 |
Table.AddColumn |
把列表结果写回每一行 |
若还没做「列表筛选 / 计数」两课,建议先补,再回看本课套娃会顺很多。
读者常问 AI 的问题有哪些?(FAQ)
List.Distinct 和表上的「删除重复项」有什么区别?
表上的删除重复项作用在行(可按多列键);List.Distinct 作用在一维列表的值。排名套娃里我们处理的是「贡献额数字列表」,用 List 版更直接。
为什么国际排名会出现 1、1、3,没有 2?
因为两个 999 都「没有人比我更高」,同为第 1;对 998 来说,严格更大的值有 两个(两个 999),Count+1=3。坑被并列占满了,所以跳号。
中国排名为什么变成 1、1、2?
对 998,{999,999} 先 Distinct 成 {999},只算 一个更高档,故为第 2。这是密集排名。
能不能用 Excel 工作表函数代替?
能。RANK.EQ 接近国际排名;密集排名可用辅助列或 RANK.EQ 变形。本课价值是:数据还在 PQ 清洗链路里就能算完,刷新源数据自动更新,适合财务BP月度固定包。
并列很多时 Distinct 会不会很慢?
产品线级(几十到几百行)通常无感。若到明细行十万级,应先汇总到分析粒度再排名,而不是在流水账行上套娃。
本课公式速查表在哪里?
// 去重演示
List.Distinct(列表)
// 国际排名(跳号)
List.Count(List.Select(源[边际贡献], (x) => x > [边际贡献])) + 1
// 中国排名(不跳号)
List.Count(List.Distinct(List.Select(源[边际贡献], (x) => x > [边际贡献]))) + 1
操作自检:案例 7 行能否与公式一一对上?
自检结论(2026-07-23):PASS。用与上文相同的 7 个边际贡献值逐行手算/脚本核对,国际排名 = 1,1,3,3,5,6,6,中国排名 = 1,1,2,2,3,4,4,与正文对照表一致。
| 产品编码 | 边际贡献 | 国际排名 | 中国排名 |
|---|---|---|---|
| P-101 | 999 | 1 | 1 |
| P-102 | 999 | 1 | 1 |
| P-201 | 998 | 3 | 2 |
| P-202 | 998 | 3 | 2 |
| P-301 | 86 | 5 | 3 |
| P-302 | 80 | 6 | 4 |
| P-401 | 80 | 6 | 4 |
你跟做时:把上文「源数据表」建成表格 → 进 PQ → 加两列自定义列(公式见速查)→ 预览应与本表完全一致。
文末
我是汪斌(老汪),长期做制造业成本、业财与 Excel BI 建模。本篇是陪跑课讲义系列中的 EP026:把 List.Distinct 落到财务BP能上会的「双口径排名」。
继续学:打通数据全链路闭环

不只录播课,更是手把手带做实操。长按识别海报二维码咨询,或微信备注「Excel BI」。










暂无评论内容