2012-03-20 40 views
0

此问题与问题here有关。我有一个表,看起来像这样:按SQL中的计数进行分区

Item Count 
1  1 
2  4 
3  8 
4  2 
5  6 
6  3 

我需要是组项目,例如,低于5成新的组和总各组至少应为5结果应该像这样:

Item Group Count 
1  1  1 
2  1  4 
3  2  8 
4  3  2 
5  4  6 
6  3  3 

我该如何做到这一点?非常感谢。

+0

这需要如何动态?您是否只有组1和组2,或者是否会有一些可以随数据集扩展的组? – lyrisey 2012-03-20 00:12:12

+0

实际上创建的组的数量将取决于约束。在上面的示例中,我使用了5.我们的最终用户可以输入任何数字范围。 – Eric 2012-03-20 00:24:17

+0

我的第一个想法是使用APPLY与UDF,但优雅的基于行集的解决方案可能不可行。使用多语句UDF或proc可能更容易。 – wtjones 2012-03-20 01:27:29

回答

2

为什么这不是正确的结果?

Item Group Count 
1  1  1 
2  2  4 
3  3  8 
4  4  2 
5  5  6 
6  1  3 

或者这个?

Item Group Count 
1  1  1 
2  2  4 
3  3  8 
4  4  2 
5  5  6 
6  6  3 

在我看来,你正在试图解决的答案“如何分组的项目,以减少群体的数量,最大限度地提高每个组中的项目数,W/O超过限制5” 。这听起来很像Knapsack problem。也许你应该阅读Celko's SQL Stumper: The Class Scheduling Problem和提出的解决方案。其他人也遇到了这个问题,例如。 And now for a completely inappropriate use of SQL Server。单挑:这不是一个微不足道的问题。任何天真的算法将死于一个缓慢的死亡试图解决它在一个1M行表...

+0

感谢您的及时回应。在上面的示例中,每个组中最少的项目数是5.因此,如果一个组少于5个项目,则应将其分配给其他组。我不确定对性能有什么影响,但我预计每个进程少于100K行 – Eric 2012-03-20 01:18:23