I categorized a table with the method introduced here to categorize my items to folders with a limit size of 100.
mixing_order id num_items cat order_in_cat cumulative_sum folder
1 1 4 1 1 4 1
2 2 33 1 2 37 1
3 3 74 2 1 74 2
4 4 41 1 3 41 3
5 5 24 1 4 65 3
6 6 44 2 2 44 4
7 7 16 1 5 57 4
8 8 55 1 6 55 5
9 9 11 1 7 66 5
10 10 37 1 8 37 6
Now, I want to go further and re-arrange the rows to better fit within folders. Consider that the records are of two categories (indicated by column cat). We can make a better fit just by altering the order of mixing. Then, we can produce the following table as each folder has a cumulative_sum close to the folder size limit (i.e. 100 here). As you can see, the order in each category (order_in_cat) has not been changed, only the order that the rows from different categories are mixed.
mixing_order id num_items cat order_in_cat cumulative_sum folder
1 1 4 1 1 4 1
2 2 33 1 2 37 1
3 4 41 1 3 78 1
4 3 74 2 1 74 2
5 5 24 1 4 98 2
6 7 16 1 5 16 3
7 8 55 1 6 67 3
8 9 11 1 7 78 3
9 6 44 2 2 44 4
10 10 37 1 8 81 4
In other words, the mixing_order was random in order of INSERT, but now we want to re-arrange the mixing_order to best fit within folder.
Probably, we need a loop in which re-calculating SUM to find the best match out of possible choices, but I have no idea how to conduct such loop in SQL.
1(all items in the same category) toN!(all items in their own category). If you want to find the absolute best fit, this will be very slow in general. – ypercube Jan 9 at 19:20