SQL语句实现数据排序后交叉分组

这里面主要解决简单分组问题,一堆数据排名后进行分组编号。抽象的场景就是假设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结果来看就没啥问题了。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值