This is false, but not scary for the example data. Your mileage may vary.
declare @groupcount int = 5; create table t (id int identity(1, 1), value int); insert t values (100),(456),(121),(402),(253),(872),(765),(6529),(1029),(342) , (98),(1),(0),(4),(46),(23),(456),(416),(2323),(4579); ;with cte as ( select * , rn = row_number() over (order by value asc) , pct = value/sum(value+.0) over() , target = 1.0 / @groupcount from t ) , remaining as ( select id, value, rn , grp = convert(int,(sum(value) over (order by rn)/sum(value+.0) over())*@groupCount)+1 from cte ) select grp = row_number() over (order by sum(value) desc) , sumValue = sum(value) from remaining group by grp
Demo version of rexter: http://rextester.com/UNV61100
results:
+-----+----------+ | grp | sumValue | +-----+----------+ | 1 | 6529 | | 2 | 4579 | | 3 | 3483 | | 4 | 2323 | | 5 | 1901 | +-----+----------+
<h / "> Compatible version of Sql Server 2008:
declare @groupcount int = 5; create table t (id int identity(1, 1), value int); insert t values (100),(456),(121),(402),(253),(872),(765),(6529),(1029),(342) , (98),(1),(0),(4),(46),(23),(456),(416),(2323),(4579); ;with cte as ( select * , rn = row_number() over (order by value asc) , pct = value/tv.TotalValue , target = 1.0 / @groupcount from t cross join (select TotalValue = sum(value+.0) from t) tv ) , remaining as ( select id, value, rn , grp = convert(int,((x.sumValueOver/TotalValue)*@groupcount)+1) from cte outer apply ( select sumValueOver = sum(value) from cte i where i.rn <= cte.rn ) x ) select grp = row_number() over (order by sum(value) desc) , sumValue = sum(value) from remaining group by grp
registry: http://rextester.com/DEUDJ77007
returns:
+-----+----------+ | grp | sumValue | +-----+----------+ | 1 | 6529 | | 2 | 4579 | | 3 | 3483 | | 4 | 2323 | | 5 | 1901 | +-----+----------+