#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