Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 T-SQL. Цикл.  [new]
nextTyro
Member

Откуда:
Сообщений: 146
Доброго времени суток!
В таблице есть поле, по которому, начиная с первого значения надо последовательно вычесть все следующие значения этого же поля и каждую разность положить в соответствующее действию (построчно) следующее поле этой же таблицы.
Пример:

Name Meaning Result
1. Kolya 1 000
2. Vanya 70 930 (т.е., предыдущее знач. поля 1000 - 70)
3. Zhenya 120 810 (т.е., предыдущее знач. поля 930 - 120) и т.д.
4. Kolya 505 305
5. Sveta 15 290
6. Nadya 90 200
...

100. Vanya ..... .....

Возможно ли как-то решить в цикле? Спасибо большое заранее.
23 апр 14, 15:16    [15923207]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL. Цикл.  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5122
lag
23 апр 14, 15:22    [15923258]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL. Цикл.  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Дедушка
lag
Нарастиающий итог?
SUM()OVER(ORDER BY)) не проще?
23 апр 14, 15:24    [15923272]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL. Цикл.  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
nextTyro
Доброго времени суток!
В таблице есть поле, по которому, начиная с первого значения надо последовательно вычесть все следующие значения этого же поля и каждую разность положить в соответствующее действию (построчно) следующее поле этой же таблицы.
Пример:

Name Meaning Result
1. Kolya 1 000
2. Vanya 70 930 (т.е., предыдущее знач. поля 1000 - 70)
3. Zhenya 120 810 (т.е., предыдущее знач. поля 930 - 120) и т.д.
4. Kolya 505 305
5. Sveta 15 290
6. Nadya 90 200
...

100. Vanya ..... .....

Возможно ли как-то решить в цикле? Спасибо большое заранее.

можно и без цикла, если 1,2,3 - это кластерный индекс, то

declare @Res int
update SomeTable set
  @Res = Result = Meaning - @Res
23 апр 14, 15:40    [15923396]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL. Цикл.  [new]
nextTyro
Member

Откуда:
Сообщений: 146
Ну да - что-то вроде нарастающей разности. Т.е., Сначала поле заполнено величиной, которая должна убывать по мере вычитания из нее последующих значений этого же поля (с сохранением в параллельном поле значений этой разности). Табличка некорректно отобразилась...

N/n_|_Name_|_Meaning_|_ Result
1.__|_Kolya__|_1000____|_______
2.__|_Vanya__|__ 70____|_ 930 (т.е., предыдущее знач. поля 1000 - 70)
3.__|_Zhenya_|__120____|_ 810 (т.е., предыдущее знач. поля 930 - 120) и т.д.
4.__|_Kolya__|__505____|__305
5.__|_Sveta__|___15____|__290
6.__|_Nadya__|___90____|__200
...

100. Vanya ..... .....

Так понятнее?
23 апр 14, 15:41    [15923401]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL. Цикл.  [new]
prog882
Guest
nextTyro,
;with cte as (
select id, name, meaning, result = meaning from @t where id = 1 union all
select t.id, t.name, t.meaning, result=cte.result-t.meaning from cte join @t t on cte.id + 1 = t.id)
select * from cte
23 апр 14, 16:36    [15923889]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL. Цикл.  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
MS SQL 2012
SELECT *, 2*FIRST_VALUE(Meaning)OVER(ORDER BY ID)-SUM(Meaning)OVER(ORDER BY ID)
FROM T
ORDER BY ID;
23 апр 14, 16:50    [15923995]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL. Цикл.  [new]
nextTyro
Member

Откуда:
Сообщений: 146
К сожалению, MS SQL - 2008 ...
24 апр 14, 14:11    [15929164]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL. Цикл.  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
nextTyro
К сожалению, MS SQL - 2008 ...

так а чем мой ответ не подошел?
24 апр 14, 15:50    [15930091]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL. Цикл.  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Bator
nextTyro
К сожалению, MS SQL - 2008 ...

так а чем мой ответ не подошел?
Порядок UPDATE не гарантирован - это говнокод
24 апр 14, 15:51    [15930097]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL. Цикл.  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
iap
Bator
пропущено...

так а чем мой ответ не подошел?
Порядок UPDATE не гарантирован - это говнокод

согласен, но если надо очень быстро, то этот хак имеет смысл
24 апр 14, 17:17    [15930963]     Ответить | Цитировать Сообщить модератору
 Re: T-SQL. Цикл.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Bator,
Вы не сказали главное - как стабилизировать запрос, чтобы порядок не прыгал и был правильный.
Т.е. что нужно дописать в коде, чтобы работало как надо (в большей части).

CTE (15923889) пока решает задачу, скорее приемлемо для ТС.
24 апр 14, 23:40    [15932640]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить