同事为处理大批量数据让大模型帮忙写了一个分批处理的逻辑具体需求如下1.将所有数据均匀分为8组8个channel这里的8组可以根据需求改变比如10组12组等可以把下面我改完的逻辑封装成函数具体分为几组可作为参数传入即实现动态分批处理2.以某个字段字段为type排序将排序后的数据进行分组3.前多少条分到第一组中间多少条分到第二组依次4.如果8组不能完全分配多余的数据条数从上到下逐一分配5.例假设只有25条数据排序后前4条为第1组第5-7条为第2组依次大模型写出来的逻辑有点问题数据并没有均分比如假设数据总数为25按大模型的逻辑第1组分了2条数据第2组至第6组每组分了4条第7组分了3条第8组没有分到数据这样是不均匀的。于是我便在大模型的基础上调整了它的逻辑最终实现了均匀分配。下面是大模型写的逻辑do language plpgsql$$declaretypes int;v_channel_id int;v_max_days int; -- 存储每个channel的type数量v_total_types int;v_types_per_channel int;v_remaining_types int;begin-- 获取总type数量v_total_types 25;-- 计算每个channel应分配的type数量v_types_per_channel : v_total_types / 8;v_remaining_types : v_total_types % 8;raise notice 总共types个数为%,最小channel_id容量为%,求模数为%,v_total_types,v_types_per_channel,v_remaining_types;-- 按type排序遍历并根据序号分配到对应的channel_id (1-8)FOR types IN1..v_total_typesLOOP-- 计算当前type应该分配到哪个channelv_channel_id : ((types - 1) / CEIL(v_total_types::DECIMAL / 8)) 1;-- 确保channel不超过8v_channel_id : LEAST(v_channel_id, 8);-- 计算当前channel的type容量(max_days)IF v_channel_id v_remaining_types THEN-- 前v_remaining_types个channel多分配一个typev_max_days : v_types_per_channel 1;ELSE-- 其余channel按基础数量分配v_max_days : v_types_per_channel;END IF;raise notice 当前是第%个type值分组进入第%个channel,该channel的容量为%,types,v_channel_id,v_max_days;END LOOP;end;$$执行输出如下 NOTICE: 当前是第1个type值分组进入第1个channel,该channel的容量为4 NOTICE: 当前是第2个type值分组进入第1个channel,该channel的容量为4 NOTICE: 当前是第3个type值分组进入第2个channel,该channel的容量为3 NOTICE: 当前是第4个type值分组进入第2个channel,该channel的容量为3 NOTICE: 当前是第5个type值分组进入第2个channel,该channel的容量为3 NOTICE: 当前是第6个type值分组进入第2个channel,该channel的容量为3 NOTICE: 当前是第7个type值分组进入第3个channel,该channel的容量为3 NOTICE: 当前是第8个type值分组进入第3个channel,该channel的容量为3 NOTICE: 当前是第9个type值分组进入第3个channel,该channel的容量为3 NOTICE: 当前是第10个type值分组进入第3个channel,该channel的容量为3 NOTICE: 当前是第11个type值分组进入第4个channel,该channel的容量为3 NOTICE: 当前是第12个type值分组进入第4个channel,该channel的容量为3 NOTICE: 当前是第13个type值分组进入第4个channel,该channel的容量为3 NOTICE: 当前是第14个type值分组进入第4个channel,该channel的容量为3 NOTICE: 当前是第15个type值分组进入第5个channel,该channel的容量为3 NOTICE: 当前是第16个type值分组进入第5个channel,该channel的容量为3 NOTICE: 当前是第17个type值分组进入第5个channel,该channel的容量为3 NOTICE: 当前是第18个type值分组进入第5个channel,该channel的容量为3 NOTICE: 当前是第19个type值分组进入第6个channel,该channel的容量为3 NOTICE: 当前是第20个type值分组进入第6个channel,该channel的容量为3 NOTICE: 当前是第21个type值分组进入第6个channel,该channel的容量为3 NOTICE: 当前是第22个type值分组进入第6个channel,该channel的容量为3 NOTICE: 当前是第23个type值分组进入第7个channel,该channel的容量为3 NOTICE: 当前是第24个type值分组进入第7个channel,该channel的容量为3 NOTICE: 当前是第25个type值分组进入第7个channel,该channel的容量为3截图如下我修改完后的逻辑如下do language plpgsql$$declaretypes int; --假设type为某个表用以排序的字段v_channel_id int; --当前的types应该分配进第几个channelv_max_days int; --当前channel_id的type容量v_total_types int; --总的types个数v_types_per_channel int; --该次分配中channel_id的最小容量v_remaining_types int; --求模数即以分成8个channel_id为例会剩余几个type无法完成一轮分配begin-- 获取总type数量v_total_types 25; --假设总的type个数为25这个个数可以随意改动以验证是否均匀分配假设要分配的channel个数为8-- 计算每个channel应分配的type数量v_types_per_channel : v_total_types / 8; --该次分配中channel_id的最小容量v_remaining_types : v_total_types % 8; --求模数即以分成8个channel_id为例会剩余几个type无法完成一轮分配raise notice 总共types个数为%,最小channel_id容量为%,求模数为%,v_total_types,v_types_per_channel,v_remaining_types;-- 按type排序遍历并根据序号分配到对应的channel_id (1-8)FOR types IN1..v_total_typesLOOP-- 计算当前type应该分配到哪个channelv_channel_id : floor((types - 1) / CEIL(v_total_types::DECIMAL / 8)) 1;--大于求模数的部分重新计算channel_idif v_channel_id v_remaining_types thenv_channel_id : floor((types-1((v_remaining_types1)*floor(v_total_types::DECIMAL / 8) - v_remaining_types*ceil(v_total_types::DECIMAL / 8))) / floor(v_total_types::DECIMAL / 8));end if;-- 计算当前channel的type容量(max_days)IF v_channel_id v_remaining_types THEN-- 前v_remaining_types个channel多分配一个typev_max_days : v_types_per_channel 1;ELSE-- 其余channel按基础数量分配v_max_days : v_types_per_channel;END IF;raise notice 当前是第%个type值分组进入第%个channel,该channel的容量为%,types,v_channel_id,v_max_days;END LOOP;end;$$执行输出如下 NOTICE: 当前是第1个type值分组进入第1个channel,该channel的容量为4 NOTICE: 当前是第2个type值分组进入第1个channel,该channel的容量为4 NOTICE: 当前是第3个type值分组进入第1个channel,该channel的容量为4 NOTICE: 当前是第4个type值分组进入第1个channel,该channel的容量为4 NOTICE: 当前是第5个type值分组进入第2个channel,该channel的容量为3 NOTICE: 当前是第6个type值分组进入第2个channel,该channel的容量为3 NOTICE: 当前是第7个type值分组进入第2个channel,该channel的容量为3 NOTICE: 当前是第8个type值分组进入第3个channel,该channel的容量为3 NOTICE: 当前是第9个type值分组进入第3个channel,该channel的容量为3 NOTICE: 当前是第10个type值分组进入第3个channel,该channel的容量为3 NOTICE: 当前是第11个type值分组进入第4个channel,该channel的容量为3 NOTICE: 当前是第12个type值分组进入第4个channel,该channel的容量为3 NOTICE: 当前是第13个type值分组进入第4个channel,该channel的容量为3 NOTICE: 当前是第14个type值分组进入第5个channel,该channel的容量为3 NOTICE: 当前是第15个type值分组进入第5个channel,该channel的容量为3 NOTICE: 当前是第16个type值分组进入第5个channel,该channel的容量为3 NOTICE: 当前是第17个type值分组进入第6个channel,该channel的容量为3 NOTICE: 当前是第18个type值分组进入第6个channel,该channel的容量为3 NOTICE: 当前是第19个type值分组进入第6个channel,该channel的容量为3 NOTICE: 当前是第20个type值分组进入第7个channel,该channel的容量为3 NOTICE: 当前是第21个type值分组进入第7个channel,该channel的容量为3 NOTICE: 当前是第22个type值分组进入第7个channel,该channel的容量为3 NOTICE: 当前是第23个type值分组进入第8个channel,该channel的容量为3 NOTICE: 当前是第24个type值分组进入第8个channel,该channel的容量为3 NOTICE: 当前是第25个type值分组进入第8个channel,该channel的容量为3截图如下