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

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

Спасибо

_______________________________________________________________
Самурай без меча - это как самурай с мечем но, только без меча
2 июн 11, 18:22    [10755044]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное значение за период  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
sashka304,

sum()?
2 июн 11, 18:27    [10755069]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное значение за период  [new]
ё
Guest
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
2 июн 11, 18:32    [10755095]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное значение за период  [new]
AmKad
Member

Откуда:
Сообщений: 5308
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
2 июн 11, 18:33    [10755102]     Ответить | Цитировать Сообщить модератору
 Re: Максимальное значение за период  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
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).

    Если нигде не накосячил - будет работать.
  • 2 июн 11, 18:43    [10755161]     Ответить | Цитировать Сообщить модератору
     Re: Максимальное значение за период  [new]
    SamMan
    Member

    Откуда: Moscow
    Сообщений: 759
    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


    Остроумно, но нужно же, конечно, >= в предпосл. строке.
    2 июн 11, 19:00    [10755267]     Ответить | Цитировать Сообщить модератору
     Re: Максимальное значение за период  [new]
    sashka304
    Member

    Откуда: Кривой Рог - Киев
    Сообщений: 1191
    Благодарю за варианты!

    WarAnt , просто sum() непройдет
    а вот хитрый вариант товарища AmKad работает так как нужно!
    Интересно как будет нагружать сервер это скриптик если значений буде достаточно много. Как я понял сначала суммируются все с потом выведется максимум.
    2 июн 11, 19:10    [10755319]     Ответить | Цитировать Сообщить модератору
     Re: Максимальное значение за период  [new]
    AmKad
    Member

    Откуда:
    Сообщений: 5308
    sashka304
    а вот хитрый вариант товарища AmKad работает так как нужно!

    Обратить внимание на 10755267
    2 июн 11, 19:20    [10755359]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить