Как выбрать следующее значение сразу после определенного значения в SQL Server? - PullRequest
0 голосов
/ 15 декабря 2018

enter image description here enter image description here

Я хочу выбрать значения, которые следуют сразу после stat = idle

Ответы [ 3 ]

0 голосов
/ 15 декабря 2018
with cte as 
 (
    select *,
       case when lag(stat,1,'idle') over (order by time) = 'idle' -- previous row is idle
             and stat <> 'idle'                                   -- current row is not idle
            then 1
            else 0
       end as flag 
    from tab
 )
select * from cte
where flag = 1

Это также возвращает первую строку, если вы хотите исключить ее, удалите значение по умолчанию из lag.

0 голосов
/ 15 декабря 2018

Вы можете попробовать следующий запрос, используя задержку, как показано ниже

create table #temp (id int identity (1,1), times datetime, gps_speed decimal(18,2),I2 int, stat varchar(20), row_num int)
insert into #temp values 
('2018-12-14', 18.52, 1, 'running', 4),
('2018-12-14', 0, 1, 'idle', 5),
('2018-12-14', 24.08, 1, 'running', 6),
('2018-12-14', 37.04, 1, 'running', 29),
('2018-12-14', 0, 1, 'idle', 30),
('2018-12-14', 0, 1, 'idle', 32),
('2018-12-14', 18.52, 1, 'running', 37),
('2018-12-14', 35.19, 1, 'running', 41),
('2018-12-14', 16.67, 1, 'running', 42),
('2018-12-14', 0, 1, 'idle', 43),
('2018-12-14', 0, 1, 'idle', 44)    

select * from (
select 
      lag(stat, 1) OVER(ORDER BY [id]) as Prev,*
from #temp
)a where Prev <> stat
and Prev = 'idle' or Prev is null

Вывод такой, как показано ниже

Prev    id  times   gps_speed           I2  stat     row_num
NULL    1   14.12.2018 00:00:00 18,52   1   running  4
idle    3   14.12.2018 00:00:00 24,08   1   running  6
idle    7   14.12.2018 00:00:00 18,52   1   running  37

Вот демонстрационная версия в реальном времени - Демо <> Предыдущее значение

0 голосов
/ 15 декабря 2018
        SELECT * FROM TABLE WHERE   
        ROWNUM>ANY(SELECT  
         Max(ROWNUM)
         FROM TABLE WHERE 
        STATUS='IDLE')

Это должно работать, я думаю, чтобы получить желаемое значение, внешний запрос работает строка за строкой, а подзапрос возвращает значение rownum, как только он получает статус простоя

...