2016-07-11 90 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。 –

相关问题