如有如下的表和记录
----------------------------------
id | count | thread
---------------------------------
1 4
2 5
4 7
9 10
5 5
6 8
7 7
----------------------------------
现在把所有的记录分成3组,要求每组的count之和大致相当
可能的结果如下:
----------------------------------
id | count | thread
---------------------------------
1 4 1
2 5 1
4 7 1
9 10 2
5 5 2
6 8 3
7 7 3
----------------------------------
现在要把这个过程写成一个存储过程(其中组数作为一个参数传入)。
请各位高手提供效率尽可能高的实现或算法。分数可再开贴给
----------------------------------
id | count | thread
---------------------------------
1 4
2 5
4 7
9 10
5 5
6 8
7 7
----------------------------------
现在把所有的记录分成3组,要求每组的count之和大致相当
可能的结果如下:
----------------------------------
id | count | thread
---------------------------------
1 4 1
2 5 1
4 7 1
9 10 2
5 5 2
6 8 3
7 7 3
----------------------------------
现在要把这个过程写成一个存储过程(其中组数作为一个参数传入)。
请各位高手提供效率尽可能高的实现或算法。分数可再开贴给
NTILE(3) (ORDER BY id DESC NULLS FIRST) AS thread
FROM table1
---------- ----------
6 3
7 5
8 5
9 5
10 5
11 5
12 5
13 5
14 5
15 6已选择10行。已用时间: 00: 00: 00.61
SQL> select id,cou,ceil(rownum/((count(*) over())/3)) from t; ID COU CEIL(ROWNUM/((COUNT(*)OVER())/3))
---------- ---------- ---------------------------------
6 3 1
7 5 1
8 5 1
9 5 2
10 5 2
11 5 2
12 5 3
13 5 3
14 5 3
15 6 3已选择10行。已用时间: 00: 00: 00.60
SQL>
ID PRICE CEIL(ROWNUM/((COUNT(*)OVER())/
---------- ---------- ------------------------------
1 2 1
2 3 1
3 7 2
4 8 2
5 1 2
6 10 3
7 7 3
8 4 3
NTILE(3) over(ORDER BY id DESC NULLS FIRST) AS thread
FROM table1
---------- ---------- ---------------------------------------
6 3 1
7 5 1
8 5 1
9 5 2
10 5 2
11 5 2
12 5 3
13 5 3已选择8行。已用时间: 00: 00: 00.50
SQL>
---------- ---------- ----------
1 4 1
2 5 1
4 7 1
9 10 2
5 5 2
6 8 3
7 7 37 rows selected
ID COUNT THREAD
---------- ---------- ----------
1 4 1
2 5 1
4 7 1
9 10 2
5 5 2
6 8 3
7 7 3
这样分是因为 4+5+7 ~= 10+5 ~= 8+7
id | count | thread
---------------------------------
1 4 1
2 5 2
4 7 3
9 10 2
5 5 1
6 8 3
7 7 1
----------------------------------这种状态也符合楼主要求,那么楼主需要的结果就不具备唯一性,所以个人认为没有实现的含义。