2012-10-25 85 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