长期读者,第一次海报。 tldr;在底部
我需要计算静态数据点集和动态组合基集之间的绝对差值之和。
SQL 2005
问题:
想想10个带有序列号的圆形磁铁:1,3,6,7,8,11,12,13,18,20 每个磁铁有7个数据点,表示使用高斯计在磁铁周围进行的高斯测量。
因为这些测量值在给定的磁体内变化不大,但是在两个不同的磁体之间变化很大,我试图计算一组磁体之间的绝对差值的和。
我首先将SUMMING 7个数据点,然后将这些SUMS相互比较。通过按最小的SAD排序,您可以快速识别哪两个磁铁最接近。 SUM(ABS(Magnet1_DataPoints - Magnet2_DataPoints))
当试图找到具有最小SAD的N组磁体时,棘手的部分开始了。这变成了组合C(n,r)问题,增加了复杂性。我可能有40个磁铁,需要用最小的SAD拉出一组8个磁铁。我可以有30个,需要拉4个磁铁。因此,这个问题的动态性也会进入。
我正在寻找有关如何在SQL中编写此内容的一些指导。到目前为止,我已经碰到了几面墙,特别是当试图通过SP递归地进行时。当试图通过CTE处理时,数据点让我感到悲伤。
我发现了许多递归组合算法的例子,但是我很难将它们适应我的特定用例。
非常感谢任何和所有帮助!
更重要的细节:
1。)磁铁ID将是唯一的整数,一旦消耗,将被标记为“已检出”并带有布尔0/1字段。
2.)高斯数字将以十进制(18,2)开头。
3.)如果更容易,我可能需要单独的磁铁“数量/分组”程序,即4,8,12(很可能是它们将被拉入的增量)。
4.)磁铁/ ID订单很重要。 1,2,3,4与2,3,1,4(相同组合)相同
5.)理想情况下,输出将是表示分组和总SAD的列表,即具有3个磁体的请求。
ID1, ID2, ID3, SAD
36, 28, 29, 20.0
36, 28, 31, 22.00
34, 28, 29, 24.00
表格请求:
CREATE TABLE #TmpMagTable ( IDOne int, TopMiddleOne decimal(18,2), TopLeftOne decimal(18,2), TopRightOne decimal(18,2), MiddleOne decimal(18,2), BotLeftOne decimal(18,2), BotRightOne decimal(18,2), BotMiddleOne decimal(18,2), checked int)
INSERT INTO #TmpMagTable
SELECT 1,1,2,3,4,5,6,7,0
UNION ALL SELECT 10,7,5,6,4,2,3,1,0
UNION ALL SELECT 19,4,2,5,7,3,6,1,0
UNION ALL SELECT 28,1,2,2,3,2,2,1,0
UNION ALL SELECT 2,2,3,4,5,6,7,8,0
UNION ALL SELECT 11,8,6,7,5,3,4,2,0
UNION ALL SELECT 20,8,3,6,5,4,7,2,0
UNION ALL SELECT 29,3,2,2,1,2,2,3,0
UNION ALL SELECT 3,3,4,5,6,7,8,9,0
UNION ALL SELECT 12,9,7,8,6,4,5,3,0
UNION ALL SELECT 21,3,4,7,9,5,8,6,0
UNION ALL SELECT 30,5,3,3,2,5,5,4,0
UNION ALL SELECT 4,4,5,6,7,8,9,10,0
UNION ALL SELECT 13,10,8,9,7,5,6,4,0
UNION ALL SELECT 22,7,5,8,4,6,9,10,0
UNION ALL SELECT 31,4,1,3,5,4,3,1,0
UNION ALL SELECT 5,5,6,7,8,9,10,11,0
UNION ALL SELECT 14,11,9,10,8,6,7,5,0
UNION ALL SELECT 23,5,6,9,11,7,10,8,0
UNION ALL SELECT 32,3,4,6,2,4,1,2,0
UNION ALL SELECT 6,6,7,8,9,10,11,12,0
UNION ALL SELECT 15,12,10,11,9,7,8,6,0
UNION ALL SELECT 24,9,7,10,6,8,11,12,0
UNION ALL SELECT 33,5,3,3,6,1,1,2,0
UNION ALL SELECT 7,7,8,9,10,11,12,13,0
UNION ALL SELECT 16,13,11,12,10,8,9,7,0
UNION ALL SELECT 25,7,8,11,13,9,12,10,0
UNION ALL SELECT 34,1,3,3,0,2,1,5,0
UNION ALL SELECT 8,8,9,10,11,12,13,14,0
UNION ALL SELECT 17,14,12,13,11,9,10,8,0
UNION ALL SELECT 26,8,9,12,14,10,13,11,0
UNION ALL SELECT 35,6,1,3,1,0,0,2,0
UNION ALL SELECT 9,9,10,11,12,13,14,15,0
UNION ALL SELECT 18,15,13,14,12,10,11,9,0
UNION ALL SELECT 27,12,10,13,9,11,14,15,0
UNION ALL SELECT 36,1,3,2,5,3,2,1,0
tldr;需要递归组合算法来对每个唯一组合的值求和