мой 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 будет также ожидаться.
Я думаю, вы можете использовать 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
);
Ниже запроса будет получен желаемый результат.
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)
Вы также можете использовать предложение GROUP BY
, если вы хотите, чтобы только подгруппа & группа:
select subgroup, max(grp) as grp
from foo f
group by subgroup
having min(grp) = max(grp);