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

Откуда:
Сообщений: 26
Добрый день, форумчане.

Имеется следующая выборка:
Date_Time Value1
2018-06-10 10:00:00 255
2018-06-10 10:00:10 260
2018-06-10 10:00:20 275
2018-06-10 10:00:30 285
2018-06-10 10:00:40 289
Пусть для примера сидит в #TempTable

Т.е. значение в колонке Value постоянно растет.
Мне нужно получить разницу между каждым приращением:

2018-06-10 10:00:10 5
2018-06-10 10:00:20 15
2018-06-10 10:00:30 10
2018-06-10 10:00:40 4

Как это лучше всего сделать через view в sql2000?

Самообъединение типа :
SELECT p1.[Date_Time],abs(p1.[Value1]-p2.[Value1])
FROM #TempTable p1 inner join #TempTable p2 on p1.Date_Time=p2.Date_Time
даст просто :
2018-06-10 10:00:00 0
2018-06-10 10:00:10 0
2018-06-10 10:00:20 0
2018-06-10 10:00:30 0
2018-06-10 10:00:40 0

А как-бы учесть еще и разницу по времени между отсчетами?
Заранее спасибо.
13 июн 18, 14:17    [21488423]     Ответить | Цитировать Сообщить модератору
 Re: Расчет разницы значений  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
SELECT Date_Time, Value1
,Dif=Value1-ISNULL(
 (SELECT TOP 1 TT.Value1
  FROM #TempTable TT
  WHERE TT.Date_Time<T.Date_Time
  ORDER BY TT.Date_Time DESC),0)
FROM #TempTable T
ORDER BY Date_Time;
13 июн 18, 14:36    [21488510]     Ответить | Цитировать Сообщить модератору
 Re: Расчет разницы значений  [new]
aleks222
Member

Откуда:
Сообщений: 857
iap
SELECT Date_Time, Value1
,Dif=Value1-ISNULL(
 (SELECT TOP 1 TT.Value1
  FROM #TempTable TT
  WHERE TT.Date_Time<T.Date_Time
  ORDER BY TT.Date_Time DESC),0)
FROM #TempTable T
ORDER BY Date_Time;


Работать это будет. Но медленно.

Если ужо и так временная таблица - надо вставить данные туда с последовательной нумерацией
select *, identity(int, 1) as n into #RightTempTable from  #TempTable order by Date_Time asc

-- опосля чего самосоединение становится тривиальным
select * from #RightTempTable as t left outer join #RightTempTable as p on p.n = t.n - 1
13 июн 18, 14:47    [21488554]     Ответить | Цитировать Сообщить модератору
 Re: Расчет разницы значений  [new]
Const123
Member

Откуда:
Сообщений: 26
Спасибо, iap, вроде первый вариант работает, но как действительно быть c быстродействием, если таких столбцов в таблице в итоге будет много, т. е. структура таблицы планируется быть таковой: Date_Time,Value1,...,Value100 ? И временная таблица просто приведена как пример, так я планировал выводить данные во вьюхе.
13 июн 18, 14:58    [21488585]     Ответить | Цитировать Сообщить модератору
 Re: Расчет разницы значений  [new]
Const123
Member

Откуда:
Сообщений: 26
Спасибо всем откликнувшимся форумчанам.
Немного погодя приходится вернуться к заданному вопросу, но уже с измененными условиями:
теперь если разность между соседними значениями выборки равна 0 ( Dif=Value1-ISNULL(... из примера, любезно предоставленного
iap ), то в запросе выводить разность, рассчитанную на предыдущем временном промежутке, если первая же разность при этом равна 0, то необходимо выводить 0, но если две разности и больше подряд равны 0, вместо первой разности надо выводить рассчитанную на
предыдущем временном промежутке, для второй и последующей разности выводить 0 до тех пор, пока разность не станет отличной от 0. Теперь уже окончательно голова кругом идет. Как все это завернуть в единый запрос?
23 июл 18, 10:17    [21593241]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить