2012-10-25 29 views
4

我想通过获取field1和field2唯一的记录来查询表,同时选择field4具有某些值而非优先级为null的行。选择具有少量唯一列的记录,同时选择非空值优先于另一列优先

例如在原始表

field1 field2 field3 field4 
    1  B  A  (null) 
    1  B  A  2 
    2  C  A  3 
    2  D  A  (null) 
    3  D  F  3 
    2  C  A  3 

而且是我想从输出查询来获取这样的:

field1 field2 field3 field4 
    1  B  A  2 
    2  C  A  3 
    2  D  A  (null) 
    3  D  F  3 

是否存在SQL表的joinning技术/过滤来实现这一目标的任何有效的方法?感谢

P/S - 为了避免混淆,具有不同FIELD1的目的和FIELD2仅是因为字段3可以具有所选择的行将基于那些行其field4中不优先

空不同的值

eg

field1 field2 field3 field4 
    1  B  A  (null) 
    1  B  C  2  <- this will be the chosen one 
+2

是field3也是键的一部分,或者你只是想选择恰好相应的field3的值吗?例如。如果附加行的值为2,D,X,1,会发生什么? – jeroenh

+0

嗨,请参阅我刚添加的P/S解释。是的,对于'2,D,X,1',这将被选择而不是表中现有的'2,D,A,(null)',因为那些非空的行将优先。谢谢 – Tsubasa

回答

5

试试这个:

你只需要组由前3场,并采取MAX()的filed4

select "field1","field2","field3",max("field4") 
from Table1 
group by "field1","field2","field3" 
order by "field1" 


SQL fiddle demo

编辑:

如果你想只有FIELD1和FIELD2为分组,然后尝试的一部分,这一点:

select "field1","field2","field3","field4" 
from(
select "field1","field2","field3","field4", 
     row_number() 
     over(partition by "field1","field2" order by "field4" desc) as rn 
from Table1)A 
where A.rn=1 


SQL Fiddle Demo 2

+2

为什么field3包含在group by子句中?提问者希望只区分field1和field2。 – Hari

+0

@哈里:谢谢你指出..我已经更新了我的答案 –

+0

+1,现在没关系:) –

1

您可以使用最大,但一定要确保你选择正确的字段3。这将做到这一点:

select field1, 
    field2 , 
    max(field3) keep (dense_rank first order by field4 desc) as field3, 
    max(field4) 
from Table1 
group by field1, field2 ,field3, 
order by field1, field2