Максимальное значение за период

sashka304
Дата: 02.06.2011 18:22:58
Добрый день,
Есть такая задачка:
Есть начальное значение у переменной
и есть табличка которая отображает на сколько изменилось это значение в разные периоды времени
Нужно найти максимальное значение которое было за данный период.
Т.е пусть вначале было число 100
в течении времени оно изменялось на
+5, -10, -20,+100, -30
получается
100+5 = 105
105-10 = 95
95-20 = 75
75+100 = 175
175-30 = 145
итого максимальное было 175
решение в лоб -> проходим курсором проводи арифметическую операцию потом сравниваем с значением в переменной и если больше то записываем в переменную
можно сделать без курсора?

Спасибо

_______________________________________________________________
Самурай без меча - это как самурай с мечем но, только без меча
WarAnt
Дата: 02.06.2011 18:27:04
sashka304,

sum()?
ё
Дата: 02.06.2011 18:32:00
select max(res) as max_res from
(select id,
(select sum(val) from @t t2 where t2.id<=t1.id) as res
from @t t1 ) a
max_res     
----------- 
75
AmKad
Дата: 02.06.2011 18:33:04
with s as
(select 1 id, 5   n union all
 select 2 id, -10 n union all 
 select 3 id,  20 n union all
 select 4 id ,-10 n
)
select max(sm) + 100 d
from
 (select s1.id, sum(s2.n) sm
  from      s s1
  left join s s2 on s1.id > s2.id
  group by s1.id
 ) t
SamMan
Дата: 02.06.2011 18:43:15
WarAnt
sum()?


Это мимо, а вот моя идея (не проверял!):

1. Структура таблицы будет такая: ID (identity), OldZnach, Delta, NewZnach (вычисляемое, NewZnach AS OldZnach + Delta)
2. Первая строка (из примера): 1, 100, 0, 100
3. Каждое изменение (Delta) не инсертится, а апдейтится. Т.е. апдейт колнки Delta строки с макс. ID.
4. На таблице триггер after на апдейт который инсертит новую строку со значениями:
  • OldZnach=NewZnach предыдущей (последней) строки
  • Delta=0

    5. Ответ на поставленную задачу в любой момент времени элементарен и мгновенен - MAX(NewZnach).

    Если нигде не накосячил - будет работать.
  • SamMan
    Дата: 02.06.2011 19:00:20
    AmKad
    from
     (select s1.id, sum(s2.n) sm
      from      s s1
      left join s s2 on s1.id > s2.id
      group by s1.id
     ) t


    Остроумно, но нужно же, конечно, >= в предпосл. строке.
    sashka304
    Дата: 02.06.2011 19:10:55
    Благодарю за варианты!

    WarAnt , просто sum() непройдет
    а вот хитрый вариант товарища AmKad работает так как нужно!
    Интересно как будет нагружать сервер это скриптик если значений буде достаточно много. Как я понял сначала суммируются все с потом выведется максимум.
    AmKad
    Дата: 02.06.2011 19:20:58
    sashka304
    а вот хитрый вариант товарища AmKad работает так как нужно!

    Обратить внимание на 10755267