SQL возвращает только следующую 1 строку того же типа после определенной строки - PullRequest
0 голосов
/ 03 октября 2019

У меня есть 4 «Операции», которые называются Start, Finish, Available, Unavailable. Каждый раз, когда я вижу строку, где «Операция» = Доступно, я хочу вернуть только следующую 1 строку, где операция = «Начать» (сохраняя строку «Завершить» для того же идентификатора), до следующей строки, где «Операция»= Доступен (который, когда это произойдет, я хочу снова вернуть только следующую 1 строку, где Operation = Start).

Итак, начиная с этого набора данных

Time        ID          Operation
6:34:50 AM  2016544     Finish
6:33:09 AM  2016544     Start
6:32:12 AM  2015289     Finish
6:32:07 AM  2015268     Finish
6:31:53 AM  2015834     Finish
6:31:39 AM  2015539     Finish
6:31:14 AM  Available   Available
6:31:12 AM  Unavailable Unavailable
6:31:02 AM  2015289     Start
6:30:57 AM  2015268     Start
6:30:42 AM  2015834     Start
6:30:28 AM  2015539     Start
6:30:22 AM  Available   Available

Я хотел бы получитьк этому

Time        ID          Operation
6:34:50 AM  2016544     Finish
6:33:09 AM  2016544     Start
6:31:39 AM  2015539     Finish
6:31:14 AM  Available   Available
6:31:12 AM  Unavailable Unavailable
6:30:28 AM  2015539     Start
6:30:22 AM  Available   Available

Ответы [ 2 ]

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

Я не полностью следую объяснениям. Но ваши примерные данные и результаты предполагают, что вам нужна первая строка, в которой появляется последовательность операций того же типа:

select t.*
from (select t.*, lag(operation) over (order by time) as prev_operation
      from t
     ) t
where prev_operation is null or prev_operation <> operation;
0 голосов
/ 03 октября 2019

Из вашего желаемого результата, я думаю, вы хотите последнюю операцию из последовательности тех же операций. Попробуйте:

select Time, ID, Operation
    from (
    select Time, ID, Operation,
           rownumber() over (partition by grp order by Time desc) rn
    from (
        select *,
               rownumber() over (order by time) -
                 rownumber() over (partition by Operation order by time) grp
        from MyTable
    ) a
) a where rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...