【问题标题】:SQL: getting the max value of one column and the corresponding other columns [duplicate]SQL:获取一列和相应的其他列的最大值[重复]
【发布时间】: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 表达式

标签: sql oracle greatest-n-per-group


【解决方案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)
猜你喜欢
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 2022-11-11
  • 2021-02-19
  • 2017-12-18
  • 1970-01-01
相关资源
最近更新 更多