Я не женат на этом алгоритме, поэтому не стесняйтесь использовать любую идею - этот алгоритм просто иллюстрирует проблему, которую я пытаюсь решить. Предположим, у меня есть таблица с «RecID», «Value» и «Result». Я хотел бы выделить значения для каждой строки для других строк. Так, например:Хитрый алгоритм SQL, может быть, есть лучший способ
Допустим, у вас есть таблица:
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) Сортировать эту таблицу по COALESCE (ABS (результат), ABS (значение)), ABS (значение)) в ASC порядок, так что вы получите:
RecID, Value, Result 2, -30, NULL 1, 60, NULL 4, -200, NULL 5, -250, NULL 6, 300, NULL
2) ОБРАБОТКА rOW1 и ROW2: Поскольку признаки значения противоположны (row1 и Стр2) отнимать значение row1 от row1 и Row2 и напишите, что осталось. Поэтому заберите -30 из RecID 1 и напишите результат и добавьте -30 к значению в RecID 2 и напишите результат и отсортируйте снова на COALESCE (ABS (результат), ABS (значение)), ABS (значение)) :
RecID, Value, Result 2, -30, 0 <-- 1, 60, 30 <-- 4, -200, NULL 5, -250, NULL 6, 300, NULL
3) ОБРАБОТКА ROW2 и ROW3: Поскольку признаки значения являются противоположными (Стр2 и Row3) забирают 30 (результат RECID 1) из RECID 4 и записывать результат, забрать тот же 30 из RecID 1 и записать результат и отсортировать его снова на COALESCE (ABS), ABS (значение)), ABS (значение)):
RecID, Value, Result 2, -30, 0 1, 60, 0 <-- 4, -200, -170 <-- 5, -250, NULL 6, 300, NULL
4) ОБРАБОТКА ROW3 И ROW4: Поскольку признаки значения одинаковы для (Row3 и Row4) ничего не должно быть сделано, чтобы скопировать значение результата и сортировки снова на COALESCE (ABS (результат), АБС (значение)), АБС (значение)):
RecID, Value, Result 2, -30, 0 1, 60, 0 4, -200, -170 <-- 5, -250, -250 <-- 6, 300, NULL
5) ОБРАБОТКА ROW3 и ROW4: Поскольку признаки значения являются противоположными (Row3 и Row4) Заберите -170 (результат recid 4) от 300 и записать в результат, сортировать снова o п СОАЬЕЗСА (ABS (результат), АБС (значение)), АБС (значение)) и получить:
RecID, Value, Result 2, -30, 0 1, 60, 0 4, -200, 0 <-- 6, 300, 130 <-- 5, -250, -250
6) ОБРАБОТКА ROW4 И ROW5: Поскольку признаки значения являются противоположными (Row4 и Row5) Заберите 130 (результат RECID 6) от -250 и сортировки снова COALESCE (ABS (результат), ABS (значение)), ABS (значение)) и получаем:
RecID, Value, Result 2, -30, 0 1, 60, 0 4, -200, 0 6, 300, 0 <-- 5, -250, -120 <--
Ничто больше не может быть сетчатым, так как последние значения с противоположными знаками уже были забиты сетью.
Просто не уверен, как написать что-то подобное.
Хотите, чтобы все строки были обновлены, чтобы отразить результат 7), или вы ищете что-то еще? –
Итак, в принципе, вы хотите их суммировать, поместить сумму в одну из строк и установить остальные в ноль? – RBarryYoung
@rbarryyoung - если у вас не было последней строки, вы должны были бы на 4-м шаге и иметь 2 ненулевые строки. – Denis