2016-04-28 170 views
0

我有一个表,并在此表中有时有单个或重复行与1个不同的属性。该属性通常为空或具有值。我如何编写一个select语句来返回所有没有重复的数据,并选择具有该值的数据以及它没有的数据,然后返回null的属性。SQL Oracle查询 - 选择语句

例如

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 

应该从select语句返回:(无重复)

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

其值应有所回升,当属性不为空? –

+0

你有试过吗?如果不起作用呢? – Lexi

+0

'你可以通过id,sd'选择id,sd,max(FEED) –

回答

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 

我明白使用聚合函数max和组,你想要每个组合的(ID,SD)a的所有不同值FEED只有在没有其他值存在的情况下才为空。而不是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