Oracle SQL:提取与组内最大列值链接的值
常见的数据库任务涉及选择与列的最大值关联的值,尤其是在处理分组数据时。 让我们考虑一个包含 KEY
、NUM
和 VAL
列的表:
KEY | NUM | VAL |
---|---|---|
A | 1 | AB |
B | 1 | CD |
B | 2 | EF |
C | 2 | GH |
C | 3 | HI |
D | 1 | JK |
D | 3 | LM |
目标是找到每个NUM
及其对应的KEY
的最大值VAL
。所需的输出:
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
一种方法使用子查询:
<code class="language-sql">select KEY, VAL from TABLE_NAME TN where NUM = ( select max(NUM) from TABLE_NAME TMP where TMP.KEY = TN.KEY );</code>
然而,一种更高效、更易读的方法是使用 ROW_NUMBER()
函数:
<code class="language-sql">select key, val from (select t.*, row_number() over (partition by key order by num desc) as seqnum from table_name t ) t where seqnum = 1;</code>
这会根据降序 KEY
值在每个 NUM
组内分配排名。 然后,WHERE
子句筛选最高排名 (seqnum = 1
),产生所需的结果:
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
虽然两种方法达到相同的结果,但 ROW_NUMBER()
方法通常提供更好的性能和清晰度,特别是对于较大的数据集。 最佳选择取决于特定的需求和偏好,但是 ROW_NUMBER()
为这个常见的 SQL 问题提供了强大且优雅的解决方案。
以上是如何在 Oracle SQL 中高效检索与组内最大列值相关的值?的详细内容。更多信息请关注PHP中文网其他相关文章!