Выберите, только если все значения идентичны для данного идентификатора - PullRequest
0 голосов
/ 08 апреля 2020

Рассмотрим следующую таблицу

C1    || C2  ||
---------------
1     || a   ||
1     || b   ||
2     || a   ||
3     || b   ||
3     || b   ||

Я хотел бы выбрать все строки R с одинаковым значением C1, чтобы все значения C2 были равны. В моем примере я:

  • не получу первые 2 строки (поскольку они имеют одинаковое значение C1 = 1, но разные значения C2 = a | b)
  • получить третий ряд (без дублирования C1)
  • получить 4-й и 5-й ряд (в одном ряду), поскольку они имеют одинаковое значение C1 = 3 и одинаковое значение C2 = b.

Я написал этот запрос: SELECT C1, C2 FROM mytable group by C1, C2 having count(*) = 1;, но это не работает: я получаю все строки ...

Я знаю почему: group by также выполняется на C2, но я не знаю, как поступить иначе ...

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020
select c1, max(c2) as c2_value
from your_table
group by c1
having count(distinct c2) = 1

Используйте count(distinct c2) для подсчета только различных значений.
Также я использовал max(c2) вместо c2, так как вам нужно агрегировать столбец, если вы не группируете по it.

Чтобы получить все значения c1, вы можете сделать:

select c1, 
       case when count(distinct c2) = 1 
            then max(c2) 
            else null
       end as c2_value
from your_table
group by c1
1 голос
/ 08 апреля 2020

Помимо использования GROUP BY, вы также можете достичь желаемого результата, используя аналитические функции NOT EXISTS и ROW_NUMBER следующим образом:

select distinct c1, c2
  from your_table t
 where not exists (select 1 from your_table t1
                    where t.c1 = t1.c1
                      and t.c2 <> t1.c2);

select distinct c1, c2 
  from (select c1, c2, count(1) over (partition by c1,c2) as cnt
          from your_table)
 where cnt = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...