如何用SQL实现分组间Count值均衡,使各组Count达到平均水平?
问题描述
我想用ntile函数把一批关联有Count值的Sales ID划分为4个分组,但当前分组结果里第4组包含两个Count值极高的Sales ID,导致各组的Count总和差距明显。我需要编写SQL语句来平衡这4个分组,让各组的Count值总和尽量接近平均水平,达成目标分组效果。
当前使用的SQL语句:
SELECT TABLEA.SALESID,TABLEA.COUNT,ntile(4) OVER(ORDER BY null) AS PART_NUMBER FROM TABLEA;
解决方法
你当前用的ntile(4) OVER(ORDER BY null)是随机分组逻辑,完全无法实现按Count值平衡分组的需求。要让各组Count总和尽量平均,核心是把大Count值的记录打散分配到不同分组,具体实现如下:
通用数据库写法
SELECT SALESID, COUNT, MOD(ROW_NUMBER() OVER(ORDER BY COUNT DESC), 4) + 1 AS PART_NUMBER FROM TABLEA;
SQL Server专属写法(用%替代MOD函数)
SELECT SALESID, COUNT, (ROW_NUMBER() OVER(ORDER BY COUNT DESC) % 4) + 1 AS PART_NUMBER FROM TABLEA;
逻辑说明
- 先按Count值从高到低排序,让大数值的Sales ID优先进入分配队列
- 用行号取模4再加1生成1-4的分组编号,让大值依次分到1、2、3、4组并循环,从根源避免大值扎堆在同一组,最终各组的Count总和会更接近平均水平
内容的提问来源于stack exchange,提问作者Shan
相关产品推荐
相关产品推荐

