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