2013-07-12 1 views
-1

Я не женат на этом алгоритме, поэтому не стесняйтесь использовать любую идею - этот алгоритм просто иллюстрирует проблему, которую я пытаюсь решить. Предположим, у меня есть таблица с «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  <-- 

Ничто больше не может быть сетчатым, так как последние значения с противоположными знаками уже были забиты сетью.

Просто не уверен, как написать что-то подобное.

+0

Хотите, чтобы все строки были обновлены, чтобы отразить результат 7), или вы ищете что-то еще? –

+0

Итак, в принципе, вы хотите их суммировать, поместить сумму в одну из строк и установить остальные в ноль? – RBarryYoung

+0

@rbarryyoung - если у вас не было последней строки, вы должны были бы на 4-м шаге и иметь 2 ненулевые строки. – Denis

ответ

1

Красиво представленный алгоритм.Это все сгорает до:

SELECT sum(values) AS result FROM #temp; 

-120 Возвращает. Или есть что-то еще, чего вы хотите достичь?

+0

Удачная попытка, но если вы опустите последнюю строку из таблицы #temp, таблица на шаге 4 должна быть возвращена. -170 будет оставлено для RecId 4 и -250 для RecID 5. Это не должно быть только 1 значение, это должен быть набор строк со значениями, которые не могут быть полностью отключены. – Denis

Смежные вопросы