首頁 >資料庫 >mysql教程 >如何透過分組高效率地檢索SQL中的最大值和關聯值?

如何透過分組高效率地檢索SQL中的最大值和關聯值?

DDD
DDD原創
2025-01-17 19:26:101019瀏覽

How Can I Efficiently Retrieve the Maximum Value and Associated Value in SQL with Grouping?

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn