数据库有一大堆数据,如
ID Name Num ZU
1 XX1 53 Null
2 XX2 44 Null
3 XX3 36 Null
4 XX4 47 Null
5 XX5 54 Null
6 XX6 21 Null
7 XX7 80 Null
8 XX8 99 Null
9 XX9 103 Null
10 XX10 25 Null
11 XX11 85 Null
12 XX12 75 Null
13 XX13 14 Null
14 XX14 76 Null
15 XX15 45 Null
16 XX16 82 Null
17 XX17 24 Null
18 XX18 32 Null
19 XX19 46 Null
20 XX20 55 Null
21 XX21 77 Null
22 XX22 90 Null
.
.
.
.
N        XXN      N现在要求根据Num列,将数据分成多个组,每组的Num值的合计的数值相差不大,然后将组的序号放到“ZU”这列。
分不多,先给100,不够另开贴在给

解决方案 »

  1.   

    比如说,这批数据的总数是80条,分为20组,第一组的数据是这批数据的ID为1,2,3,4的数据,其Num值相加为170,将第一组的ZU更新为组名“N1”,往后每组都是4条记录,Num值合计相差不大。如果单条记录大于合计值的就不用管。
      

  2.   

    ID不一定的按顺序的,很多都已经规定好,不是随机的,可能我的表达能力不是很好,我会尽量地让大家知道。比如说,这一批数据有5530条记录,则如果分为50条一组(天,这么重要的信息都忘了数据分组的有按50条一组,按40条一组两种,),则可以分110组,剩余30条记录,分的这110组Num合计相当
      

  3.   

    我有一个方法,大体思路说下,看是否对楼主有帮助:
    1.用sum()求出数据表中总和,再除去总记录数,即一个平均数.
    2.num值大于平均数的单独分组.
    3.num值小于平均数的,先按降序排列.逐一累加.接近平均数则分一组.
    4.每分一组就重复执行第3步.直到分完.
      

  4.   

    就是求分组方法?使得所分的组的sum值最平均??
    这个好像是NP问题了
      

  5.   

    还是没有解决,谢谢各位的关注,我现在先试一下shaoyiyang26的方法,可行不可行我都会把结果贴出来。
      

  6.   

    dinoalex说的没错大于平均数的数据过多的情况会有很多,分组太多了.
    这个方法需改进下.
    这个算法的要求你描述的不是很清楚,我的理解是这样:
    1.将N条数据分组,每组Num总和相等,设为S(不知道相差不大是什么意思,这里我按相等了).
    2.每组的记录数相等,将每组的记录数设为M
    3.单条记录Num值大于S的单独分组.
    按以上条件分组的话,主要是要确定两个要点:
    1.S的取值范围.
    首先仍然是先求一个Num的平均数.设为V;将其做为S的最小取值.
    再用总记录数N/2*V,将其做为S的最在值(假设最少应分两组).
    这样每组Num总和的取值范围就明确了,即V<=S<=(N/2*V),然后就程式遍历取值就可以了.
    2.M的取值范围.
    每组记录数最少得有1条,所以M最小取值应为1.最大值在S明确后可以通过程式取得总和等于S最在值.
    这样M的取值范围也搞定了.
    现在程式大至写法也明确了.
    for V=S to (N/2*V) do
    begin
      先将单条记录大于V的值单独分一组.
      for M=1 to V do
      begin
        列出剩下未分组的记录.(排序方式不一样,分组结果可能也不一样)
        将符合V和M条件的分组.
        记录分组情况
      end; 
      if 仍有未分组的记录 then 
        清除此次分组情况记录
    end;
    最后列出所有可能的分组.