SQL — Перебор дубликатов для создания нового условного столбца

#sql #oracle #oracle-sqldeveloper

#sql #Oracle #oracle-sqldeveloper

Вопрос:

Оооочень у меня есть данные в базе данных Oracle, из которой я беру несколько строк, которые выглядят следующим образом

 ID  TYPE 
1   A
1   B
2   A
  

У меня есть список типов, которые преобразуются в условный столбец, например (если A, то Y, если B, то N), так что это выглядит так

 ID  TYPE COND
1   A    Y
1   B    N
2   A    Y
  

Есть ли способ добавить еще один столбец, который проверял бы, все ли значения в столбце COND для определенного идентификатора равны Y? Таким образом, конечный результат был бы таким:

 ID  TYPE COND COND2
1   A    Y    N
1   B    N    N
2   A    Y    Y
  

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

Ответ №1:

Используйте аналитическую функцию. В этом случае min() делает то, что вы хотите:

 select t.*,
       min(cond) over (partition by id) as cond2
from t;
  

Ответ №2:

 drop table x101;
create table x101 (
id intEGER,
typ varchar2(20)
);


insert into x101 values (1, 'A');
insert into x101 values (1, 'B');
insert into x101 values (2, 'A');
insert into x101 values (4, 'A');
insert into x101 values (4, 'C');
insert into x101 values (5, 'A');
insert into x101 values (5, 'T');
commit;

With q1 as (
select id, typ,
       case typ 
          when 'A' then 'Y' 
          when 'B' then 'N' 
          when 'C' then 'Y' 
          else 'NA' 
       end as cond
from x101
order by id, typ
)
select id, typ,
       cond,
       case 
          when count(distinct case when cond != 'Y' then 1 end) over (partition by id) = 0 then 'Y' 
          when count(distinct case when cond != 'Y' then 1 end) over (partition by id) = 1 then 'N' 
          else 'NA' 
       end as cond2
from q1
order by id, typ
;
  

дает

 ID  TYP CODE    CODE2
1   A   Y   N
1   B   N   N
2   A   Y   Y
4   A   Y   Y
4   C   Y   Y
5   A   Y   N
5   T   NA  N