0

我不喜欢这个算法,所以可以随意使用任何想法——这个算法只是说明了我试图解决的问题。假设我有一个包含“RecID”、“Value”和“Result”的表。我想将每一行的值与其他行相比较。例如:

假设您有一张桌子:

SELECT RecID, Value, Result
INTO #temp
FROM (
SELECT 1 as RecID, 60 as Value, NULL as result
UNION
SELECT 2 as RecID, -30 as Value, NULL as result
UNION
SELECT 4 as RecID, -200 as Value, NULL as result
UNION
SELECT 5 as RecID, -250 as Value, NULL as result
UNION
SELECT 6 as RecID, 300 as Value, NULL as result
) a

1) 按 ASC 顺序按COALESCE(ABS(result),ABS(value)), ABS(value))对该表进行排序,您将得到:

RecID, Value, Result
2,     -30,   NULL             
1,     60,    NULL       
4,     -200,  NULL
5,     -250,  NULL
6,     300,   NULL

2)处理ROW1和ROW2:由于值的符号相反(Row1和Row2),从Row1和Row2中取出Row1的值并写入剩下的结果。因此,从 RecID 1 中取出 -30 并写入结果,并将 -30 添加到 RecID 2 中的值并写入结果并再次排序COALESCE(ABS(result),ABS(value)), ABS(value))

RecID, Value, Result
2,     -30,   0        <--
1,     60,    30       <--
4,     -200,  NULL
5,     -250,  NULL
6,     300,   NULL

3)处理ROW2和ROW3:由于值的符号相反(Row2和Row3)从RecID 4中取出30(recid 1的结果)并写入结果,从RecID 1中取出相同的30并写入结果并在COALESCE(ABS(result),ABS(value)), ABS(value))上再次排序:

RecID, Value, Result
2,     -30,   0
1,     60,    0        <--
4,     -200,  -170     <--
5,     -250,  NULL
6,     300,   NULL

4) 处理第 3 行和第 4 行:由于(第 3 行和第 4 行)值的符号相同,因此无需执行任何操作,因此将值复制到结果并再次对COALESCE(ABS(result),ABS(value)), ABS进行排序(价值))

RecID, Value, Result
2,     -30,   0
1,     60,    0
4,     -200,  -170     <--
5,     -250,  -250     <--
6,     300,   NULL

5)处理ROW3和ROW4:由于值的符号相反(Row3和Row4)从300中取出-170(recid 4的结果)并写入结果,再次对COALESCE(ABS(result),ABS(value)排序))、ABS(值))并得到:

RecID, Value, Result
2,     -30,   0
1,     60,    0
4,     -200,  0       <--    
6,     300,   130     <--
5,     -250,  -250  

6)处理ROW4和ROW5:由于值的符号相反(Row4和Row5)从-250中取出130(recid 6的结果)并在COALESCE(ABS(result),ABS(value))上再次排序,ABS (值))并得到:

RecID, Value, Result
2,     -30,   0
1,     60,    0
4,     -200,  0
6,     300,   0         <--
5,     -250,  -120      <--

因为最后一个带有相反符号的值已经被净值了,所以没有更多的东西可以被净值。

只是不知道如何写这样的东西。

4

1 回答 1

1

很好地提出了算法。这一切都归结为:

SELECT sum(values) AS result FROM #temp;

退货-120。或者您还有其他想要实现的目标吗?

于 2013-07-13T03:51:33.910 回答