Получить запись, в которой значение столбца существует только в определенной группе в Postgresql

0

мой Postgresql TABLE выглядит,

CREATE TABLE foo(man_id, subgroup, power, grp)
AS VALUES
    (1, 'Sub_A',  4, 'Group_A'),
    (2, 'Sub_B', -1, 'Group_A'),
    (3, 'Sub_A',  5, 'Group_A'),
    (4, 'Sub_B',  1, 'Group_A'),
    (5, 'Sub_B',  6, 'Group_B'),
    (6, 'Sub_B',  2, 'Group_B'),
    (7, 'Sub_C',  2, 'Group_B');
    (8, 'Sub_B',  2, 'Group_C');

У нас есть четыре столбца man_id, subgroup, power, grp. Я хочу получить записи, где subgroup существует только в одном grp. Здесь вы можете найти Sub_A subgroup только в Group_A grp. Итак, мой ожидаемый результат должен быть,

1, Sub_A,  4, Group_A
3, Sub_A,  5, Group_A

Каков рекомендуемый способ его достижения?

Решение MySQL будет также ожидаться.

Теги:

3 ответа

1
Лучший ответ

Я думаю, вы можете использовать not exists:

select f.*
from foo f
where not exists (select 1
                  from foo f2
                  where f2.subgroup = f.subgroup and
                        f2.grp <> f.grp
                 );
0

Ниже запроса будет получен желаемый результат.

 with foo(man_id, subgroup, power, grp) as (
    select * from
    (
    VALUES
    (1, 'Sub_A',  4, 'Group_A'),
    (2, 'Sub_B', -1, 'Group_A'),
    (3, 'Sub_A',  5, 'Group_A'),
    (4, 'Sub_B',  1, 'Group_A'),
    (5, 'Sub_B',  6, 'Group_B'),
    (6, 'Sub_B',  2, 'Group_B'),
    (7, 'Sub_C',  2, 'Group_B'),
    (8, 'Sub_B',  2, 'Group_C')
    ) as x(man_id, subgroup, power, grp)
),res (subgroup) as (
   select
     subgroup
   from foo
   group by subgroup
   having count(distinct grp)=1
)
select f.* from foo f join res using(subgroup)


0

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

select subgroup, max(grp) as grp
from foo f
group by subgroup
having min(grp) = max(grp);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню