首頁 >資料庫 >mysql教程 >如何使用視窗函數在 Oracle SQL 中高效選擇基於最大值的值?

如何使用視窗函數在 Oracle SQL 中高效選擇基於最大值的值?

Susan Sarandon
Susan Sarandon原創
2025-01-17 19:17:09553瀏覽

How Can I Efficiently Select Maximum-Based Values in Oracle SQL Using Window Functions?

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

如何運作

  1. OVER (PARTITION BY key ORDER BY num DESC) 子句按 KEY 列對資料進行分區,並按 NUM 列對每個分區進行降序排序。
  2. ROW_NUMBER() 為其分區內的每一行分配唯一的排名。 NUM 值最高的行的排名為 1。
  3. 外部 WHERE 子句過濾結果,僅保留帶有 seqnum = 1 的行,有效地為每個 NUM 選擇最大 KEY 值。

主要區別

關鍵點:與替代方法不同,視窗函數方法保證每個 KEY 一行,即使多行共享相同的最大 NUM 值。 在這種情況下,此行為可能與可能傳回多行的其他技術不同。 如果這種區別不重要,那麼視窗函數由於其清晰度和效率而提供了更好的解決方案。

以上是如何使用視窗函數在 Oracle SQL 中高效選擇基於最大值的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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