Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Const123 Member Откуда: Сообщений: 28 |
Добрый день, форумчане. Имеется следующая выборка: 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] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
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] Ответить | Цитировать Сообщить модератору |
aleks222 Member Откуда: Сообщений: 1232 |
Работать это будет. Но медленно. Если ужо и так временная таблица - надо вставить данные туда с последовательной нумерацией 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] Ответить | Цитировать Сообщить модератору |
Const123 Member Откуда: Сообщений: 28 |
Спасибо, iap, вроде первый вариант работает, но как действительно быть c быстродействием, если таких столбцов в таблице в итоге будет много, т. е. структура таблицы планируется быть таковой: Date_Time,Value1,...,Value100 ? И временная таблица просто приведена как пример, так я планировал выводить данные во вьюхе. |
13 июн 18, 14:58 [21488585] Ответить | Цитировать Сообщить модератору |
Const123 Member Откуда: Сообщений: 28 |
Спасибо всем откликнувшимся форумчанам. Немного погодя приходится вернуться к заданному вопросу, но уже с измененными условиями: теперь если разность между соседними значениями выборки равна 0 ( Dif=Value1-ISNULL(... из примера, любезно предоставленного iap ), то в запросе выводить разность, рассчитанную на предыдущем временном промежутке, если первая же разность при этом равна 0, то необходимо выводить 0, но если две разности и больше подряд равны 0, вместо первой разности надо выводить рассчитанную на предыдущем временном промежутке, для второй и последующей разности выводить 0 до тех пор, пока разность не станет отличной от 0. Теперь уже окончательно голова кругом идет. Как все это завернуть в единый запрос? |
23 июл 18, 10:17 [21593241] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |