чтобы проверить ID проходит через все предыдущие этапы - PullRequest
0 голосов
/ 15 мая 2018
id  current stage  previous stages
1      06              05
1      06              03

2      04              03
2      04              02

Предположим, есть 5 этапов идентификатора (02,03,04 и т. Д.). Идентификатор должен пройти через каждый из этапов. Здесь в примере Id = 1 пропускает этапы 04 и 02, но id = 2 проходит через все. Так что это должен быть текущий этап -1 и -2 и т. Д.

Я должен идентифицировать такие идентификаторы, которые пропускают этапы. Мне нужно сделать это с помощью запроса PostgreSQL.

1 Ответ

0 голосов
/ 15 мая 2018

Предполагая, что текущий / предыдущий уникален для каждого идентификатора:

select id
from tab
group by id
having min(previous_stage) <> 2           -- doesn't start with 2
    or max(current_stage) - 2 <> count(*) -- there's at least one missing stage

Edit:

Применить distinct, если previous_stage не является уникальным в id:

select id
from tab
group by id
having min(previous_stage) <> 2           -- doesn't start with 2
    or max(current_stage) - 2 <> count(distinct previous_stage) -- there's at least one missing stage

Edit:

Мои предыдущие запросы имели неверную логику, это должно было быть or вместо and. Это должно соответствовать вашим требованиям:

select id
from tab
group by id
having not
 -- these are the correct ids
 (     min(previous_stage) = 2           -- start with 2
   and max(current_stage) - min(previous_stage) = count(distinct previous_stage)  -- no missing steps
   and max(previous_stage) =  max(current_stage) -1 -- no greater step  
 )
...