Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Расчет разницы значений / 5 сообщений из 5, страница 1 из 1
13.06.2018, 14:17
    #39660304
Const123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет разницы значений
Добрый день, форумчане.

Имеется следующая выборка:
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

А как-бы учесть еще и разницу по времени между отсчетами?
Заранее спасибо.
...
Рейтинг: 0 / 0
13.06.2018, 14:36
    #39660320
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет разницы значений
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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;
...
Рейтинг: 0 / 0
13.06.2018, 14:47
    #39660331
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет разницы значений
iap
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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;



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

Если ужо и так временная таблица - надо вставить данные туда с последовательной нумерацией
Код: sql
1.
2.
3.
4.
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
...
Рейтинг: 0 / 0
13.06.2018, 14:58
    #39660341
Const123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет разницы значений
Спасибо, iap , вроде первый вариант работает, но как действительно быть c быстродействием, если таких столбцов в таблице в итоге будет много, т. е. структура таблицы планируется быть таковой: Date_Time,Value1,...,Value100 ? И временная таблица просто приведена как пример, так я планировал выводить данные во вьюхе.
...
Рейтинг: 0 / 0
23.07.2018, 10:17
    #39677532
Const123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет разницы значений
Спасибо всем откликнувшимся форумчанам.
Немного погодя приходится вернуться к заданному вопросу, но уже с измененными условиями:
теперь если разность между соседними значениями выборки равна 0 ( Dif=Value1-ISNULL(... из примера, любезно предоставленного
iap ), то в запросе выводить разность, рассчитанную на предыдущем временном промежутке, если первая же разность при этом равна 0, то необходимо выводить 0, но если две разности и больше подряд равны 0, вместо первой разности надо выводить рассчитанную на
предыдущем временном промежутке, для второй и последующей разности выводить 0 до тех пор, пока разность не станет отличной от 0. Теперь уже окончательно голова кругом идет. Как все это завернуть в единый запрос?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Расчет разницы значений / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]