Нахождение наибольшего текущего числа только для увеличивающегося диапазона - PullRequest
0 голосов
/ 27 января 2012
RecordNo    Speed  
--------    -----
1           0
2           0
3           0
4           0
5           23
6           66
7           48
8           0
9           31
10          0
11          34
12          23

Приведенные выше данные показывают скорость транспортного средства за определенный период времени, учитывая приведенные выше данные, которые мне нужны для достижения результата ниже:

RecordNo    Speed   LastAcceleration
--------    -----   ----------------
1           0       0
2           0       0
3           0       0
4           0       0
5           23      23
6           66      66
7           48      66
8           0       66
9           31      31
10          0       31
11          34      34
12          23      34

Приведенный ниже код почти присутствует, но он падаетRecordno 8:

select
curr.recordno,curr.speed 
,CASE WHEN curr.speed >= ISNULL(prev.speed,0) THEN curr.speed
    ELSE (
            SELECT MAX(speed) FROM speedtest 
            WHERE recordno between (CASE WHEN curr.speed >= prev.speed then curr.recordindex else prev.recordno end ) and curr.recordno 
          ) 
END as LastAcceleration
From speedtest prev RIGHT JOIN speedtest curr
on prev.vrm = curr.vrm
and prev.recordno+1 = curr.recordno
order by curr.recordno

Я думаю, что слишком долго смотрел на это.Я пробовал самостоятельные соединения с коррелированными подзапросами, но думаю, что мне не хватает чего-то очевидного?Это для проекта 2008 года, поэтому не нужно работать с какими-либо версиями до этого.Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 27 января 2012

Вы можете сделать это следующим образом:

declare @t table(recordno int, speed int) 
insert into @t select 1,           0 
union select 2,           0 
union select 3,           0 
union select 4,           0 
union select 5,           23 
union select 6,           66 
union select 7,           48 
union select 8,           0 
union select 9,           31 
union select 10,          0 
union select 11,          34 
union select 12,          23 

;with a as
(
select recordno, speed, 0 LastAcceleration from @t
where recordno = 1
union all
select b.recordno, b.speed, 
    case when b.speed > LastAcceleration then b.speed else 
    case when a.speed = 0 then b.speed else LastAcceleration end end
from a join @t b on b.recordno - 1 = a.recordno
)
select recordno, speed, LastAcceleration from a
option (maxrecursion 0)
1 голос
/ 27 января 2012

Вот, пожалуйста!Вы в основном пропустили ту часть, где вам нужно проверять последнее ускорение, когда оно не ускоряется (часть моего запроса больше не существует)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...