这里面主要解决简单分组问题,一堆数据排名后进行分组编号。抽象的场景就是假设10个数据排名从1-10,分配成2组数据。
其实上面抽象的10个数据排序后分成2组,方式还是比较多的,说三种:
1、奇偶分配 %2 模数相同的一组
2、随机分配2组(之前有说过分片的函数)
3、交叉选队方式(随便说的名字,我也不知道啥)
这里面同事就反馈说,这里是挑选的10个数据排序是按照实力来的,但是最后做到分配两组相对的实力比较平均。
给我举了个例子,我理解后就是相当小时候玩游戏队长择优组队的原则,A组选优先个最强的,公平起见B组再选二个名额(2,3名),再A组选二个(4,5名)按照这样的逻辑分组完成。
with tab as (
select 1 as id,1 as rod
union all
select 2 as id,0 as rod
union all
select 3 as id,0 as rod
union all
select 4 as id,1 as rod
union all
select 5 as id,1 as rod
union all
select 6 as id,0 as rod
union all
select 7 as id,0 as rod
union all
select 8 as id,1 as rod
union all
select 9 as id,1 as rod
union all
select 10 as id,0 as rod
)
select id
,rod
,id%2 as group_1
-- 分组:简单的分两组,但是为了均衡,相当于队长择优组队的原则,A组选优先个最强的,公平起见B组再选二个名额(2,3名),再A组选二个(4,5名)按照这样的逻辑分组完成
,(id + row_number()over(partition by id%2 order by id))%2 as group_2
from tab
实现的方式就是,排序按照奇偶的方式进行预先分组成两组,这样就是形成A组都是比B组的人员的排名优秀一点(A组都是奇数,B组都是偶数)。
这个时候是不太均衡的,那就将A组和B组的再排一次序,然后进行交叉对调(A组排序为偶数的给到B组,B组里面排序为偶数的A组)。最后的处理的排序值与原本的排序值进行求和取2的模即可完成分组。
最后两个排序值取模的问题:
A组原本奇数+A组排序后剔除偶数(剩余的均奇数) = 偶数(开始定义的B组)
B组原本偶数+B组排序后剔除偶数(剩余的均奇数)= 奇数(开始定义的A组)
这里面其实不管原本定义的AB组,就不会产生分歧,如果只用%2结果来看就没啥问题了。