分组排序的EXCEL函数实现

假设有这样一组数据在表中存储为如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
={
"game_fl", "game_id";
"S1", 704526; "S2", 704624;
"S1", 704646; "S2", 704762;
"S1", 704780; "S1", 704789;
"S2", 704923; "S1", 704945;
"S2", 705035; "S2", 705053;
"S1", 705100; "S1", 705120;
"S2", 705329; "S1", 705362;
"S1", 705368; "S2", 705471;
"S1", 705501; "S2", 705690;
"S2", 705802; "S2", 706055
}


现在需要新增一列显示当前game_id是所属game_fl的第几个值,假设上面数据在A1单元格,可以通过下面方式实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
=LET(
g_fl, A1:A21,
g_id, B1:B21,
v_fl, LAMBDA(rag, VLOOKUP(rag, IF({1, 0}, g_id, g_fl), 2, FALSE)),
no_arr, MAP(
g_id,
LAMBDA(t_rag,
IF(t_rag = "game_id",
"no",
SUM((g_fl = v_fl(t_rag)) * (g_id <= t_rag))
)
)
),
no_arr
)


公式的逻辑如下:

  • g_flg_id:为了方便后续处理,将要处理数据进行封装
  • v_fl(rag):根据输入的内容,返回对应game_fl的值
  • no_arr:编号列,通过MAP()对每个单元格进行计算,如果计算的单元格是game_id,代表这是第一列,所以命名为no,如果不是就计算满足game_fl为当前对应的分类而且game_id不大于当前数的数量(SUM((g_fl = v_fl(t_rag)) * (g_id <= t_rag))
    通过上面公式,最终得到的结果如下

    SUM((g_fl = v_fl(t_rag)) * (g_id <= t_rag))这个结果比较有意思,记录下