Как искать пропущенные строки в группе? - PullRequest
0 голосов
/ 27 июня 2019

Рассмотрим данные ниже. Я пытаюсь найти ситуации, когда в определенном RequestID есть Attempt: 0, но Attempt: 2 отсутствует.

Я пытался найти Attempt: 0 с предикатом WHERE и делал NOT EXISTS ... Attempt: 2 в подзапросе, но он не возвращает правильные данные.

Как найти RequestID с отсутствующими Attempt: 2?

ID      Message       RequestID
635828  Attempt: 0    1
635968  Attempt: 1    1
641085  Attempt: 2    1
641230  Attempt: 3    1
643859  Attempt: 0    2
645991  Attempt: 1    2
650255  Attempt: 3    2
652388  Attempt: 0    3
654520  Attempt: 1    3
658785  Attempt: 3    3

1 Ответ

1 голос
/ 27 июня 2019

Вы можете использовать not exists следующим образом:

select t.*
from t
where t.message = 'Attempt: 0' and
      not exists (select 1
                  from t t2
                  where t2.requestid = t.requestid and
                        t2.message = 'Attempt: 2'
                 );

Другая возможность - агрегирование:

select requestid
from t
where message in ('Attempt: 0', 'Attempt: 2')
group by requestid
having sum(case when message = 'Attempt: 2' then 1 else 0 end) = 0;
...