Sql 找到与目标加权平均数和目标总和相等的数字子集

Sql 找到与目标加权平均数和目标总和相等的数字子集,sql,sql-server,algorithm,Sql,Sql Server,Algorithm,有一个SQL server表包含100万行。示例数据如下所示。 百分比列的计算公式为=((Y/X)*100) 现在我需要找到行,使它们的amount值加起来等于给定的amount,加权平均值与给定的百分比相匹配。 例如,如果目标金额=365,目标百分比=9.84,那么从给定的数据集中,我们可以说ID=1,2,6,8,9,10的行构成与给定目标匹配的子集 Amount = 10+20+100+60+80+95 = 365 Percentage = Sum of (product

有一个SQL server表包含100万行。示例数据如下所示。 百分比列的计算公式为=((Y/X)*100)

现在我需要找到行,使它们的amount值加起来等于给定的amount,加权平均值与给定的百分比相匹配。 例如,如果目标金额=365,目标百分比=9.84,那么从给定的数据集中,我们可以说ID=1,2,6,8,9,10的行构成与给定目标匹配的子集

Amount = 10+20+100+60+80+95
       = 365 
Percentage = Sum of (product of Amount and Percentage)/Sum of (Amount)
(I am using Z column to store the products of Amount and Percentage to make the calculations easier)
       = ((10*9.5)+(20*9.5)+(100*9.23077)+(60*10.5264)+(80*10)+(95*10))/     (10+20+100+60+80+95)
       = 9.834673618
因此,第1、2、6、8、9、10行与给定的目标和和以及目标加权平均值相匹配

建议的算法应适用于100万行,主要目标是实现加权平均(百分比)匹配,数量尽可能接近目标数量

我在stackoverflow上发现了一些与目标和匹配相关的问题。但我的问题是匹配两个目标属性总和和加权平均

哪种算法可以实现这一点

由于目标“百分比”只是一个近似值(因此不是一个实际的约束),让我们尝试删除它,并为
金额
找到一个解决方案。这只会使问题变得更容易

剩下的是,这是NP完全的。有简单的指数时间解,也有鬼鬼祟祟的伪多项式时间解,但我认为它们中的任何一个都不适用于106行的表


如果这是一个学术练习,我建议你写出你能想到的最聪明的伪多项式时间解。如果这是现实世界中的一项任务,我建议你回到给你的人那里,解释一个精确的解决方案是不可行的,然后协商一个近似的解决方案。

这似乎很难。基本上,您要求的是双标准近似算法。我想,除非引入一些合理的限制,否则不存在这样的算法。我同意Beta。也许值得一看这个资源来解释这个概念:这是一个现实世界的任务。我主要关注的是在加权平均值上实现匹配,而不是求和。允许使用和值近似值,但不允许使用加权平均值。这是否可以在SQL中实现?还是动态语言?@Vin:这与您给出的示例完全相反,但是是的,您可以忽略总和,寻找与加权平均数的最佳匹配(或完美匹配,取决于您所说的“不允许近似”)。这是子集和问题的一种变体,我看不到更快的解决方法。语言的选择并不重要。
Amount = 10+20+100+60+80+95
       = 365 
Percentage = Sum of (product of Amount and Percentage)/Sum of (Amount)
(I am using Z column to store the products of Amount and Percentage to make the calculations easier)
       = ((10*9.5)+(20*9.5)+(100*9.23077)+(60*10.5264)+(80*10)+(95*10))/     (10+20+100+60+80+95)
       = 9.834673618