2016-04-28 7 views
0

У меня есть таблица, и в этой таблице есть отдельные или повторяющиеся строки с 1 различным атрибутом. Этот атрибут обычно имеет значение null или со значением. Как я могу написать оператор select, чтобы возвращать все без дубликатов и выбирать данные, которые имеют значение, и где он не работает, а затем возвращать атрибут для null.SQL Oracle Query - Select Statement

например.

ID SD  FEED 
0016 21AE GF-HF 
0016 21AE null 
0017 21BE FF-HF 
0017 21BE null 
0018 21CE CF-HF 
0018 21CE null 
0019 21DE null  
0019 21DE null 

не должны возвращаться из отборного заявления: (без дубликатов)

ID SD  FEED 
0016 21AE GF-HF 
0017 21BE FF-HF 
0018 21CE CF-HF 
0019 21DE null  
+0

, значение которого должно быть подобран, если атрибут не равно нулю? –

+0

Вы уже что-то пробовали? А если это не работает? – Lexi

+0

'select id, sd, max (FEED) из вашей группы для группы по id, sd' –

ответ

1
select distinct id, sd, feed 
    from (select id, sd, feed, max(feed) over(partition by id, sd) as mf from t) 
where (feed is not null and mf is not null) 
    or (feed is null and mf is null) 
order by id, sd, feed 

я понял, что вы все различные значения FEED для каждой комбинации (ID, SD) a nd nulls только тогда, когда не существует другого значения. Вместо max() вы можете использовать min() в analytic version.

Тест:

create table t (ID varchar2(10), SD varchar2(10), FEED varchar2(10)); 
insert into t values (0016, '21AE', 'GF-HF'); 
insert into t values (0016, '21AE', 'GF-HF'); 
insert into t values (0016, '21AE', 'AF-AF'); 
insert into t values (0016, '21AE', null); 
insert into t values (0017, '21BE', 'FF-HF'); 
insert into t values (0017, '21BE', null); 
insert into t values (0018, '21CE', 'CF-HF'); 
insert into t values (0018, '21CE', null); 
insert into t values (0019, '21DE', null); 
insert into t values (0019, '21DE', null); 

ID   SD   FEED 
---------- ---------- ---------- 
16   21AE  AF-AF 
16   21AE  GF-HF 
17   21BE  FF-HF 
18   21CE  CF-HF 
19   21DE 
+0

Мне потребовалось немного, чтобы понять это, но это было действительно очень полезно. благодаря –

2

Вы можете использовать агрегатную функцию макс и группу по

select id, sd, max(feed) 
from my_table 
group by id, sd; 
+0

Это приведет только к возврату единственного верхнего максимального результата, и он не включает в себя null или я что-то не хватает? –

+0

должен также вернуть null .. в конечном итоге вы можете использовать nvl() – scaisEdge