Как написать оператор SQL, который получает строку, если остальные строки с тем же идентификатором пользователя не являются определенным условием? - PullRequest
1 голос
/ 03 апреля 2020

Учитывая следующую таблицу:

userId |    State     |  Number
--------------------------------
 123   |   waiting    |   3
 123   |  processing  |   2
 123   |  completed   |   1

Как я могу получить строку для одного пользователя с состоянием State = waiting с учетом Number (скажем, 3 в этом случае), только если есть не является строкой для того же пользователя с более низким Number и находится в состоянии processing.

В этом примере запрос не вернет строку. Если строка с меткой Number = 2 была State = completed (вместо State = processing), то запрос вернул бы всю строку с меткой Number = 3.

1 Ответ

1 голос
/ 03 апреля 2020

Если я правильно понимаю, вы можете использовать not exists:

select t.*
from t
where t.state = 'waiting' and
      not exists (select 1
                  from t t2
                  where t2.userId = t.userId and
                        t2.state = 'processing' and
                        t2.number < 3
                 );

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

select t.*
from (select t.*,
             min(number) filter (where state = 'processing') as min_processing
      from t
     ) t
where min_processing < 3 and state = 'waiting';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...