Выберите строку, равную «X» без TOP «N» плюс предыдущую строку «Y» в SQL Server? - PullRequest
0 голосов
/ 26 октября 2019

Мне нужно вернуть в запросе только последние строки с 'ProductStatus', равным 'Stop' и предыдущей строке.

У меня есть таблица:

enter image description here

И нужно получить такой результат:

enter image description here

Как мне это сделать в SQL Server?

1 Ответ

1 голос
/ 26 октября 2019

Один метод использует оконные функции для вычисления последней остановки, а затем получает строку перед этим:

select t.*
from (select t.*,
             lead(seqnum_ps) over (partition by producttype order by datevalue) as next_seqnum_ps,
             lead(status) over (partition by producttype order by datevalue) as next_status
      from (select t.*,
                   row_number() over (partition by producttype, product_status order by datevalue desc) as seqnum_ps
            from t
           ) t
     ) t
where (seqnum_ps = 1 and product_status = 'Stop') or
      (next_seqnum_ps = 1 and next_product_status = 'Stop');

Альтернативный метод получает максимальное время остановки и использует это:

select t.*
from (select t.*,
             max(case when product_status = 'Stop' then datevalue end) over (partition by producttype) as max_stop_dv,
             lead(datevalue) over (partition by producttype order by datevalue) as next_dv
      from t
     ) t
where datevalue = max_stop_dv or
      next_dv = max_stop_dv;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...