SQL оператор для извлечения всех пользователей, которые имеют все одинаковые значения в указанном c столбце - PullRequest
0 голосов
/ 10 апреля 2020

Моя POSTGRES таблица состоит из 4 столбцов:

id  |  username  |  account #  |   active
1        john          100          true
2        amy           101          true
3        john          102          false
4        brad          103          false
5        amy           104          true
6        brad          105          false
7        brad          106          false
8        max           107          false
9        amy           108          false

У пользователя может быть несколько активных или неактивных учетных записей. Я хотел бы вернуть только пользователей, которые имеют ТОЛЬКО неактивные учетные записи (active = false), в данном случае это Брэд и Макс.

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

select username, active from table group by username ,active order by username;

username | active
john       true
john       false
amy        true
amy        false
brad       false
max        false

Ответы [ 4 ]

2 голосов
/ 10 апреля 2020

Использовать после группы по:

    select * 
    from table
    group by table.username
    having max(users.active) = False
1 голос
/ 10 апреля 2020

Вы можете использовать агрегацию:

select username
from t
group by username
having not bool_or(active);

Если вам нужны учетные записи, вы можете либо агрегировать их:

select username, array_agg(account)
from t
group by username
having not bool_or(active);

, либо использовать not exists вместо:

select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.username = t.username and t2.active
                 );
0 голосов
/ 10 апреля 2020

С агрегацией и условием в пункте, имеющем:

select username
from tablename
group by username
having max(active::int) = 0
0 голосов
/ 10 апреля 2020

Вы можете использовать предложение having, чтобы отфильтровать тех, у кого есть только неактивные учетные записи

select username
from t
group by username
having min(active)='false'and max(active)='false';

Другая альтернатива, использующая avg

select username
from t
group by username
having avg(case when active='false' then 1 else 0 end)=1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...