Tenho uma tabela assim:
v | c
---+-------
Z | 217
J | 620
U | 1891
F | 3751
A | 5673
Y | 5859
O | 7347
K | 9827
I | 11842
R | 11997
H | 14818
M | 18321
G | 18445
E | 19220
D | 22444
W | 22692
T | 24428
P | 26257
N | 35247
L | 41416
C | 42594
B | 43586
S | 59613
Como posso agrupar esses valores de forma que cada grupo tenha o valor mais próximo possível de 60.000?
Por exemplo (provavelmente não é o melhor ajuste):
Z + J + U + F + A + Y + O + K + I + R -- 59024
S -- 59613
B + H -- 58404
etc.
Um pouco de pesquisa revela que essa questão é conhecida como o problema da soma do subconjunto em ciência da computação.
No stackoverflow, Lukas Eder fornece uma solução Oracle para uma pergunta semelhante e uma análise mais longa no blog do jooq.
Aqui está uma versão postgres derivada de seu trabalho:
O resultado com os dados de amostra é:
Observe que o tempo de execução aumentará exponencialmente com a contagem de linhas na tabela base.