Puzzler:如何按特定列的特定总和对行进行分组

时间:2017-04-01 17:47:13

标签: php mysql

如何将以下行分成3组,其中“dollar”的总和为10.所有行必须使用且不得超过一次。

row|dollars
1|1
2|1
3|1
4|1
5|1
6|1
7|3
8|4
9|7
10|10

一个(很多可能的)期望结果将是......

Row Group 1 = 10
Row Group 2 = 7,9
Row Group 3 = 1,2,3,4,5,6,8

额外信用: 如果在数学上不可能在每组中得到10美元的总和,是否有一个让我们最接近的公式?

我虽然可能“总和(美元)= 10”,或者,对于一个紧密的解决方案,只需将一行排序并分配到一个组,但这并没有让我接近。

Group Row By Sum of Specific Column equal to Specific Value对此有点触动,但是,假设它们可能是数百万行,则会出现性能问题。 我很难过。

如果有帮助,我正在使用php和mysql。仅限sql的解决方案是理想的,但某些组合也会很棒。感谢您的任何建议。

编辑:如果我不清楚,我想返回使这成为可能的行,而不仅仅是“分组”。

1 个答案:

答案 0 :(得分:1)

我认为你不能用sql做到这一点,但它肯定会有所帮助。我首先得到一个像select * from data where dollars <= 10 order by dollars desc这样的查询,然后在php中创建一个算法,通过结果并累加美元,直到找到三个加起来为10的集合。

它会从大到小开始添加,直到找到正确的总和,然后存储它,从列表中删除这些项目并重新开始,三次。我在打电话,但是当我到我的电脑时,会用一个工作示例来更新答案。

编辑:到了我的电脑。这是非常混乱的代码,但它应该引导您朝着正确的方向发展。

$dataset = [10,7,4,3,1,1,1,1,1,1];
$results = [];

function add_to_ten(&$data) {
    $sum = 0;
    $results = [];

    foreach ($data as $index => &$datum) {
        if ($datum == 0) {
            continue;
        }
        if ($sum + $datum <= 10) {
            $sum += $datum;
            $results[] = $index;
            $datum = 0;
        }
        if ($sum == 10) {
            return $results;
        }
    }
}

print_r(add_to_ten($dataset));
print_r(add_to_ten($dataset));
print_r(add_to_ten($dataset));