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 由于某种原因,输出返回的结果比预期的要少得多 这没有意义..这将返回1group 行,这意味着每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:获取一列和相应的其他列的最大值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

根据由另一列分组的不同列的最大值获取值[重复]

如何按一列的最大值获取SQL行,按另一列分组

用于从 Hive 中获取单个表的最大值、最小值和其他列的相应值以及总记录数的数据库查询

有一列数 从中选出第二大的数 sql

MySql怎样获取一列中最大值

基于sql中另一列的一列中的最大数据