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中文網其他相關文章!