2012-11-06 58 views
0

我想從一個類似於表得到「最上面的」數據:如何獲得「最上面的」數據

 
A B C | Id 
1 2 3 | 1 
    4 5 | 1 
    6 | 1

AC =列
1-6值(場未設置爲空)
數據是根據它降序排列的ID序列

當我查詢我想獲得最新的寫入的數據,在這個例子中,查詢應該給我1,4和6單排:

 
a b c | Id 
1 4 6 | 1 

這是我做過嘗試,但後來我得到正確的結果,但在不同的行:

select * from 
(select id, a from dataTable where id=(select max(dt.dataRow) from dataTable dt where dt.id = 1)) a_query 
full outer join 
(select id, b from dataTable where id=(select max(dt.dataRow) from dataTable dt where dt.id = 1)) b_query 
on a_query.id=b_query.id 
full outer join 
(select id, c from dataTable where id=(select max(dt.dataRow) from dataTable dt where dt.id = 1)) c_query 
on nvl(a_query.id, b_query.id)=c_query.id 

優選的Oracle SQL

回答

3

這似乎過於複雜,只得到每個最大列(並且在列爲空值的情況下使用COALESCE):

SELECT [id], MAX(COALESCE(a, 0)) AS a, 
    MAX(COALESCE(b, 0)) AS b, 
    MAX(COALESCE(c, 0)) AS c 
FROM dataTable 
GROUP BY [id] 
+0

感謝您的回答,但我仍然得到這個解決方案,我想散佈這兩行之間的數據過多行。 –

+1

我不確定你的意思是「過多的行」或數據在兩行之間傳播?用更具體的例子來展示你的模式會很有幫助。 – LittleBobbyTables

+1

如果你有多個「ID」,那麼你將有超過1行,但它是有道理的......結果按ID – jazzytomato

0

我可能簡化了我的例子, A,B,C中的數據可能是非數字的,不能排序等等。

我發現LAST_VALUE()http://www.oracle.com/technetwork/issue-archive/2006/06-nov/o66asktom-099001.html適應得很好,這裏面將返回:

 
A B C | Id 
1 2 3 | 1 
1 4 5 | 1 
1 4 6 | 1 

爲我furhter上運行。

然後查詢看起來是這樣的:

select distinct 
last_value(a ignore nulls) over (order by id) a, 
last_value(b ignore nulls) over (order by id) b, 
last_value(c ignore nulls) over (order by id) c 
from datatable 
where datatable.id IN (select id from datatable where datatable.id = 1)