在大型 SQL 表中有效找出最大值和關聯資料
通常,資料庫查詢需要尋找某一列中的最大值,並從同一行中的其他欄位中擷取對應的資料。 對於非常大的數據集,這尤其具有挑戰性。 考慮一個需要為每個唯一 ID 找到最高版本號碼及其關聯標籤的表:
範例表:
<code>ID | tag | version -----+-----+----- 1 | A | 10 2 | A | 20 3 | B | 99 4 | C | 30 5 | F | 40</code>
期望結果:
<code>ID | tag | version -----+-----+----- 2 | A | 20 3 | B | 99 4 | C | 30 5 | F | 40</code>
對於大約2800 萬行的表,標準方法(如巢狀SELECT
語句或簡單的GROUP BY
和MAX
可能會非常慢。更有效的解決方案使用ROW_NUMBER()
視窗函數:
<code class="language-sql">SELECT s.id, s.tag, s.version FROM ( SELECT t.*, ROW_NUMBER() OVER(PARTITION BY t.id ORDER BY t.version DESC) AS rnk FROM YourTable t ) s WHERE s.rnk = 1;</code>
此查詢分兩步驟進行:
內部查詢:它為每個rnk
分區(具有相同ID的行組)中的每一行分配一個唯一的排名(ID
)。排名基於 version
列降序排列,這意味著最高版本獲得排名 1。
外部查詢: 它過濾內部查詢的結果,只選擇 rnk = 1
所在的行。 這有效地為我們提供了每個 version
具有最大 ID
的行。
這種方法避免了巢狀查詢和GROUP BY
操作,使得大型資料集的處理速度顯著加快。 ROW_NUMBER()
的使用提供了一種乾淨有效的方式來實現預期的結果。
以上是如何有效率地從大型SQL資料庫表中檢索最大值和對應資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!