EP026 List.Distinct:财务BP如何用列表去重做「国际排名」与「中国排名」

更新于 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 能独立完成哪三件事?

读完并跟做后,你应能独立完成:

  1. 在 Power Query 里用一行 M 调用 List.Distinct 去重。
  2. Table.AddColumn + 列表套娃,给经营分析表加「国际排名」「中国排名」两列。
  3. 向老板一句说清:两种排名差在「并列更高档算几个坑」。

为什么财务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.SelectList.Count+1
中国排名 密集排名 / 不跳号 1、1、2… 中间再套 List.Distinct

List.Distinct 本身怎么用?

答案先行:给一个列表,返回去掉重复后的新列表,保留首次出现顺序。

在 Power Query「高级编辑器」或自定义列里可直接试:

List.Distinct({"料工费", "制造费用", "料工费", "期间费用", "制造费用"})

返回:

{"料工费", "制造费用", "期间费用"}

对照表:

输入列表 List.Distinct 结果 说明
{语文, 数学, 英语, 语文, 英语} {语文, 数学, 英语} 教学原例的同构
{999, 999, 998} {999, 998} 排名场景里「更高档只留一档」
{} {} 空列表仍为空

这一步很薄;本课厚度在下一节的套娃排名


国际排名(跳号)在 Power Query 里怎么一步步做?

步骤 0:准备表

  1. Excel → 数据从表格/区域(或打开已有查询),进入 Power Query。
  2. 确认列名至少有:产品编码产品线边际贡献(类型为数字)。
  3. 为方便在「源」上写公式:若查询里有「更改的类型」步骤,可先删除该步(与系列课习惯一致),让公式锚定在

提示:删除「更改类型」不等于永远不要类型;排名公式写稳后,可再补类型步骤。

步骤 1:添加「国际排名」列

  1. 选中查询 → 添加列自定义列(或高级编辑器里写 Table.AddColumn)。
  2. 新列名:国际排名
  3. 公式逻辑(把 换成你的上一步步骤名,把 [边际贡献] 换成你的列名):
Table.AddColumn(
    源,
    "国际排名",
    each
        List.Count(
            List.Select(
                源[边际贡献],
                (x) => x > [边际贡献]
            )
        ) + 1
)

这段在干什么?

  1. 源[边际贡献]:整列贡献额 → 一个 List。
  2. List.Select(..., (x) => x > [边际贡献]):只留「严格大于当前行」的贡献额。
  3. 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要自检哪四项?

做完排名列后,上会前自检:

  1. 口径写进表头或备注:本月看板用的是国际还是中国?避免老板口头「按国内习惯」却出了跳号表。
  2. 并列是否合理:贡献额是否先四舍五入到万元?未圆整会导致「伪不并列」。
  3. 是否应用在正确度量:边际贡献、产量差异、材料价差——换列名即可,公式骨架不变。
  4. 下游:需要进 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 陪跑课

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


© 版权声明
THE END
喜欢就支持一下吧
点赞5987 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容