提取 Oracle SQL 中每个 KEY 的最高 VAL
本指南演示如何使用 Oracle SQL 高效检索分组数据中每个 VAL
的最大 KEY
。 让我们看一个常见的场景:
名为TABLE_NAME
的表包含以下数据:
KEY | NUM | VAL |
---|---|---|
A | 1 | AB |
B | 1 | CD |
B | 2 | EF |
C | 2 | GH |
C | 3 | HI |
D | 1 | JK |
D | 3 | LM |
目标是生成一个结果集,仅显示每个唯一 VAL
的最大 KEY
:
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
高效的 Oracle SQL 解决方案(10g 及更高版本):
虽然子查询可以实现这一点,但更优雅且通常更快的解决方案使用 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>
此查询首先为每个 seqnum
分区中的每一行分配一个排名 (KEY
),按 NUM
按降序排列。 然后,它过滤结果以仅包含具有 seqnum = 1
的行,从而有效地选择具有最高 NUM
的行(因此,隐式地,假设每个内 VAL
和 NUM
之间存在一致的关系,则最高的 VAL
键)。
重要提示: 此方法保证每个 KEY
一行。 如果您需要以不同方式处理 NUM
中的潜在关系(例如,如果多行共享最大值 KEY
,则返回 NUM
的多行),请考虑使用 RANK()
或 DENSE_RANK()
而不是 ROW_NUMBER()
。
以上是如何使用 Oracle SQL 获取分组数据中每个 KEY 的最大 VAL?的详细内容。更多信息请关注PHP中文网其他相关文章!