Oracle SQL:使用窗口函数提取最大值
在 Oracle SQL 中使用窗口函数可以轻松完成基于另一列的最大值高效检索特定列值,同时按第三个分组。与其他方法相比,这种方法具有优雅性和性能优势。
考虑这个示例表:
KEY | NUM | VAL |
---|---|---|
A | 1 | AB |
B | 1 | CD |
B | 2 | EF |
C | 2 | GH |
C | 3 | HI |
D | 1 | JK |
D | 3 | LM |
窗函数解决方案
最佳解决方案利用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 | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
如何运作
OVER (PARTITION BY key ORDER BY num DESC)
子句按 KEY
列对数据进行分区,并按 NUM
列对每个分区进行降序排序。ROW_NUMBER()
为其分区内的每一行分配唯一的排名。 NUM
值最高的行的排名为 1。WHERE
子句过滤结果,仅保留带有 seqnum = 1
的行,有效地为每个 NUM
选择最大 KEY
值。主要区别
关键点:与替代方法不同,窗口函数方法保证每个 KEY
一行,即使多行共享相同的最大 NUM
值。 在这种情况下,此行为可能与可能返回多行的其他技术不同。 如果这种区别不重要,那么窗口函数由于其清晰度和效率而提供了更好的解决方案。
以上是如何使用窗口函数在 Oracle SQL 中高效选择基于最大值的值?的详细内容。更多信息请关注PHP中文网其他相关文章!