[英]Puzzler: How To Group Rows By A Particular Sum of a Particular Column
如何將后面的行分成3組,其中“美元”的總和為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美元,那么是否有公式可以使我們與之最接近 ?
我雖然也許是“ HAVING sum(dollar)= 10”,或者,對於一個緊密的解決方案,我只是將一行排序並分配給一組,但這並不能使我接近。
將“按特定列的總和分組行”等於“特定值” ,在某種意義上是這樣,但是,假設它們可能是數百萬行,則將存在性能問題。 我很沮喪
如果有幫助,我正在使用php和mysql。 僅使用sql的解決方案將是理想的選擇,但是某些組合也將是很好的選擇。 感謝您的任何建議。
編輯:如果我不清楚,我想返回使之成為可能的行,而不僅僅是“分組”。
我認為您不能僅使用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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.