2016-07-11 124 views
1
ID| tag | version 
-----+-----+----- 
1| A | 10 
2| A | 20 
3| B | 99 
3| C | 30 
3| F | 40 

所需的輸出:SQL:獲得一列的最大值和相應的其他列

1 A 10 
2 A 20 
3 B 99 

我怎樣才能得到每一個ID和最大版本對應的標籤爲該版本?速度很重要(我有大約28米行),所以嵌套選擇不會這樣做。還有一個簡單的Group by ID和Max(版本)不起作用,因爲我也需要相應的Tag,其版本是最大的。

+2

這個問題是問和回答不休。一些答案是正確的。 – Strawberry

+0

我嘗試了一個ID與最大(版本)組,但不起作用,因爲我也需要標籤 – Nickpick

+0

看,有一個正確的 - - > – Strawberry

回答

2

使用ROW_NUMBER()

SELECT s.id,s.tag,s.version FROM (
    SELECT t.*, 
      ROW_NUMBER() OVER(PARTITION BY t.id ORDER BY t.version DESC) as rnk 
    FROM YourTable t) s 
WHERE s.rnk = 1 
+0

嵌套選擇將會非常慢我假設我有28m行 – Nickpick

+0

嵌套選擇不會損害性能,它只是讓您能夠引用在內部查詢中評估的「rnk」列。運行查詢,然後決定執行@nickpick – sagi

+0

出於某種原因,輸出返回的結果比預期的要少得多 – Nickpick

2

試試這個

select id, max(tag) keep(dense_rank first order by VERSION desc) as tag, max(version) as version 
from t group by id 
+0

爲什麼max(標籤)?標記不是一個數字。 「還沒有找到FROM關鍵字」 – Nickpick

+0

沒關係。 Oracle通過VERSION desc'查找第一順序的值。它通過desc(或max,它是相同的)找到排序的VERSION並返回第一個創建的行。然後,Oracle獲取第一個返回行的Max(tag),並且因爲它是單行,那麼max的工作正常。 –

+0

@Nickpick「FROM keyword not found where expected」 - 「from t」where t is your table。 –

相關問題