高效取得SQL分組中最大值及其關聯值的優雅方案
在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 |
目標是為每個KEY找到最大NUM對應的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>
但當KEY值較多時,這種方法顯得笨拙。 然而,使用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>
這種方法利用了分區和排序的概念來獲得期望的結果。透過將row_number()
的分區設定為KEY,並按NUM降序排序,每個分區中的每一行都會分配一個序號。然後選擇序號為1的行,即可取得每個KEY對應的最大NUM值及其關聯的VAL值。
要注意的是,這種改進後的方法與原始查詢的行為略有不同。原始查詢可能會為每個KEY傳回多行,而此解決方案確保每個KEY只傳回一行。如果需要保留原始行為,則可以使用dense_rank()
或rank()
替換row_number()
。
以上是如何透過分組高效率地檢索SQL中的最大值和關聯值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!