Excel 保持原序时计算组内排名
Excel某表格第1列是分组,第2列是日期,未排序。
A |
B |
|
1 |
Agent ID |
Date of Sale |
2 |
Agent1 |
07-12-2023 |
3 |
Agent1 |
05-12-2023 |
4 |
Agent2 |
09-12-2023 |
5 |
Agent3 |
13-12-2023 |
6 |
Agent2 |
14-12-2023 |
7 |
Agent2 |
22-12-2023 |
8 |
Agent1 |
15-12-2023 |
9 |
Agent1 |
17-12-2023 |
10 |
Agent2 |
13-12-2023 |
11 |
Agent1 |
20-12-2023 |
12 |
Agent1 |
18-12-2023 |
13 |
Agent3 |
20-12-2023 |
14 |
Agent3 |
09-12-2023 |
要求在保持原序的情况下,算出每组数据的内部排名,写在第3列:
A |
B |
C |
|
1 |
Agent ID |
Date of Sale |
result |
2 |
Agent1 |
07-12-2023 |
2 |
3 |
Agent1 |
05-12-2023 |
1 |
4 |
Agent2 |
09-12-2023 |
1 |
5 |
Agent3 |
13-12-2023 |
2 |
6 |
Agent2 |
14-12-2023 |
3 |
7 |
Agent2 |
22-12-2023 |
4 |
8 |
Agent1 |
15-12-2023 |
3 |
9 |
Agent1 |
17-12-2023 |
4 |
10 |
Agent2 |
13-12-2023 |
2 |
11 |
Agent1 |
20-12-2023 |
6 |
12 |
Agent1 |
18-12-2023 |
5 |
13 |
Agent3 |
20-12-2023 |
3 |
14 |
Agent3 |
09-12-2023 |
1 |
使用 SPL XLL
=spl("=E(?).derive(#:id,rk).sort(#1,#2).run(rk=rank(#2;#1)).sort(id).(rk)",A1:B14)
函数 E 将片区转为表格,derive 增加新列,rank 计算排序后的组内记录的排名,# 是行号,#1 是第 1 列。
英文版 https://c.scudata.com/article/1724314019898
换个写法,用 psort()和 inv()。psort 返回排序后在原序列中的位置,再用 inv() 调整回原次序。
这样写比两次 sort 要高效一些。但有个疑问:
sort 函数默认会自动多线程,那 psort 是不是也是自动多线程?我测试了 psort 好像是默认多线程,不确定。