Получить «последний» ряд исходной последовательности - PullRequest
0 голосов
/ 25 октября 2019

У меня есть таблица, как показано ниже

Пример 1:

ID      Code
1       A002
2       A001
3       A001
4       A002
5       A001
6       A002

Я хочу получить последнюю строку (начальную последовательность) A001. Результат должен быть ID = 3

Пример 2:

ID      Code
1       A001
2       A001
3       A001
4       A002
5       A001
6       A002

Я хочу получить последнюю строку (начальную последовательность) A001. Результат должен быть ID = 3

Пример 3

ID      Code
1       A001
2       A002
3       A001
4       A002
5       A001
6       A002

Я хочу получить последнюю строку (начальную последовательность) A001. Результат должен быть ID = 1

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

Я пытался запустить код ниже

select t.*
from t
where t.id < (select min(t2.id)
              from t t2
              where t2.code <> 'A001'  -- not NOT EQUALS
             ) 
order by t1.id desc;

, но в примере 1 он работает неправильно.

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

мы можем достичь этого, используя простые функции left join plus min() и max()

select coalesce(max(t2.id), min(t1.id)) from t as t1
left join t t2 on t2.id = t1.id + 1 and t2.code = t1.code
where t1.code = 'A001';
0 голосов
/ 25 октября 2019

Вот альтернативный метод с использованием оконных функций:

select max(id)
from (select min(case when code <> 'A001' and id < min_a001_id
                      then id end
                 end) as min_next_id
      from (select t.*
                   min(case when code = 'A001' then id end) over () as min_a001_id
            from t
           ) t
     ) t
where code = 'A001' and
      (min_next_id is null or id < min_next_id);

Альтернативный метод использует lead() - в первый раз следующий идентификатор не будет A001:

select min(id)
from (select t.*,
             lead(code) over (order by id) as next_code
      from t
     ) t
where code = 'A001' and
      (next_code is null or next_code <> 'A001')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...