我不喜欢这个算法,所以可以随意使用任何想法——这个算法只是说明了我试图解决的问题。假设我有一个包含“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 <--
因为最后一个带有相反符号的值已经被净值了,所以没有更多的东西可以被净值。
只是不知道如何写这样的东西。