SQL:获取一列和相应的其他列的最大值[重复]
Posted
技术标签:
【中文标题】SQL:获取一列和相应的其他列的最大值[重复]【英文标题】:SQL: getting the max value of one column and the corresponding other columns [duplicate] 【发布时间】:2016-11-13 06:20:21 【问题描述】:ID| tag | version
-----+-----+-----
1| A | 10
2| A | 20
3| B | 99
3| C | 30
3| F | 40
想要的输出:
1 A 10
2 A 20
3 B 99
如何获取每个 ID 的最大版本以及该版本的相应标签?速度很重要(我有大约 28m 行),所以嵌套的 Select 不会这样做。此外,带有 max(version) 的简单 Group by ID 也不起作用,因为我还需要版本为 max 的相应标签。
【问题讨论】:
这个问题被问和无休止地回答。有些答案是正确的。 我尝试使用 max(version) 按 ID 分组,但这不起作用,因为我还需要标签 看,那里有一个正确的 -----> 见here @manitaz 不是有效的 groupy by 表达式 【参考方案1】:使用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
【讨论】:
如果我有 28m 行,我假设嵌套选择会非常慢 嵌套选择不会影响性能,它只是让您能够引用在内部查询中评估的rnk
列。运行查询,然后决定性能@nickpick
由于某种原因,输出返回的结果比预期的要少得多
这没有意义..这将返回1
每group
行,这意味着每id
一行。 @nickpick
每个 ID 1 行是我所期望的。版本号最高的那个。【参考方案2】:
试试这个
select id, max(tag) keep(dense_rank first order by VERSION desc) as tag, max(version) as version
from t group by id
【讨论】:
为什么选择 max(tag)?标签不是数字。还有“在预期的地方找不到 FROM 关键字” 没关系。 Oracle 在 diapason 'first order by VERSION desc' 中查找值。它找到按 desc(或 max,相同)排序的 VERSION 并返回第一个创建的行。然后 Oracle 获取第一个返回行的 Max(tag),因为它是单行,所以 max 可以正常工作。 @Nickpick "FROM 关键字未在预期的位置找到" - "from t" 其中 t 是您的表。 “因为是单行所以max正常工作”:所以不用放max(tag)? 见链接oracle-base.com/articles/misc/…。这是必要的,因为它是分析函数。想象情景'3|乙| 99'和'3| C | 99'。在 id=3 上,有两个 max VERSION = 99 的值,您应该使用 max(tag)以上是关于SQL:获取一列和相应的其他列的最大值[重复]的主要内容,如果未能解决你的问题,请参考以下文章