【Power Query】用筛选和上下文 排名
国际排名
国际排名往往不是连续的整数,看起来很跳跃:假如两个人 并列第1,虽然分数一样,但是会挤占掉第2的位置,接下来会是第3名…
例如这样:
| 姓名 | 分数 | 国际排名 | 
|---|---|---|
| A | 100 | 1 | 
| B | 100 | 1 | 
| C | 98 | 3 | 
| D | 98 | 3 | 
| E | 98 | 3 | 
| F | 95 | 6 | 
于是:如果没有(0)人分数比我高,我就是第1名;如果2个人比我高,我就是第3名…
 这样只要将大于我的筛选出来,再数数有几个,加上1就是我的排名
那么函数,这里算的是销量排名:
| = Table.AddColumn(源, "国际排名", (d)=>Table.RowCount(Table.SelectRows(源,(x)=>x[销量]>d[销量]))+1) | 
步骤拆解:

-  (g)=>g :是定义上下文, 
 括号里的 g 代表【上文】也就是目前的整个表,
 右侧的 g 代表【下文】也就是在每一行里插入的内容
-  括号里可以写字母或文字,都没有关系,但前后要对应 
中国排名
中国排名则看起来很连贯,不管前面有几个并列第1,接下来一定是从第2开始
| 姓名 | 分数 | 国际排名 | 
|---|---|---|
| A | 100 | 1 | 
| B | 100 | 1 | 
| C | 98 | 2 | 
| D | 98 | 2 | 
| E | 98 | 2 | 
| F | 95 | 3 | 
于是,不管在我前面有几个人并列第1,都只算他们一个人,我还是第2 名
 那么,在筛选出大于我的所有人之后,按分数去重,也就是每个排名都只剩一个人了
 仍然+1,往后顺延一位,这就是我的排名了
| = Table.AddColumn(源, "中国排名", each Table.RowCount(Table.Distinct(Table.SelectRows(源,(x)=>x[销量]>[销量]),"销量"))+1) | 
步骤拆解:

部门排名
以中国排名为例:
| = Table.AddColumn(国际排名, "部门排名", each Table.RowCount(Table.Distinct(Table.SelectRows(国际排名,(x)=>x[销量]>[销量]and x[部门]=[部门]),"销量"))+1) | 

- 这里的 and x[部门]=[部门],前一个部门属于 套在里面的待筛选的那个表,后一个属于外面的当前的表,
- 当只有两个环境时,当前的环境可以不定义,默认就是,所以只写了一个字段。
