高效查找關係資料庫中群組內的最大值
提取包含特定列的最大值的行,同時維護關聯式資料庫中的群組完整性可能很複雜。本文解決了檢索每個唯一 ID 具有最高輪數的行的挑戰,優先考慮查詢效率。
一種方法使用子查詢:
<code class="language-sql">SELECT * FROM (SELECT id, round, CASE WHEN (MAX(round) OVER (PARTITION BY id)) = round THEN score ELSE NULL END score FROM SCORES where id in (1,2,3) ) scorevals WHERE scorevals.round is not null;</code>
但是,由於後處理過濾步驟,這種方法效率低。
為了提高效能,請考慮使用視窗函數:
<code class="language-sql">SELECT DISTINCT id ,max(round) OVER (PARTITION BY id) AS round ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score FROM SCORES WHERE id IN (1,2,3) ORDER BY id;</code>
此查詢使用視窗函數來決定每個 ID 的最大輪次,然後擷取對應的分數。 DISTINCT
關鍵字確保每個 ID 一行。
可能更快的替代方案,使用相同的視窗函數兩次:
<code class="language-sql">SELECT DISTINCT id ,first_value(round) OVER (PARTITION BY id ORDER BY round DESC) AS round ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score FROM SCORES WHERE id IN (1,2,3) ORDER BY id;</code>
兩種最佳化的解決方案都避免了不必要的過濾,與子查詢方法相比,查詢執行時間更快。
以上是如何有效率地檢索關聯式資料庫中每組最大值的行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!