SQL Server: использование Lead для присоединения к следующей записи, отвечающей условиям - PullRequest
0 голосов
/ 28 октября 2019

У меня вопрос с использованием функции lead() при определенных условиях.

Допустим, у меня есть следующая таблица:

    ----------------------------------
    id   |     time   |   condition  |
    1    |   12:00:00 |      fail    | 
    2    |   12:10:00 |      fail    |
    3    |   12:15:00 |     success  |
    4    |   12:20:00 |     success  | 

Я хочу иметь таблицу, содержащую столбец, который сообщает мне, когда наступит следующий успех, и исключаю все ошибочные записи между,Итак, как и

    ---------------------------------------------------
    id   |     time   |   condition  |   next_success |
    1    |   12:00:00 |      fail    |     12:15:00   |
    3    |   12:15:00 |     success  |     12:20:00   |
    4    |   12:20:00 |     success  |       null     |

Я знаю, что, возможно, я могу поиграть с функцией lead(), но самое близкое, что я видел, это

select *, lead(time, 1) over (partition by condition order by time) as next_time from table 

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

Надеюсь, кто-то может дать некоторые идеи о том, как решить эту проблему!

Спасибо

Ответы [ 2 ]

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

С CTE для фильтрации строк и подзапросом для возврата строки следующего успеха:

with cte as (
  select *, lag(condition, 1) over (order by time) as prev_condition
  from tablename
)
select c.id, c.time, c.condition,
  (select min(time) from cte where time > c.time and condition = 'success') as next_success
from cte c
where coalesce(c.prev_condition, '') <> 'fail' or c.condition <> 'fail' 

См. Демоверсию . Результаты:

> id | time     | condition | next_success
> -: | :------- | :-------- | :-----------
>  1 | 12:00:00 | fail      | 12:15:00    
>  3 | 12:15:00 | success   | 12:20:00    
>  4 | 12:20:00 | success   | null
0 голосов
/ 28 октября 2019

Для этого я бы использовал только оконные функции.

select id, time, condition, next_success_time
from (select id, time, condition,
             min(case when condition = 'success' then time end) over (order by time rows between 1 following and unbounded following) as next_success_time,
             lead(condition) over (order by time) as next_condition
      from t
     ) t
where not (next_condition = 'fail' and condition = 'fail')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...