有效地從每個組別中選擇最年長的個體
本文示範了兩種從資料集中的每個組別中檢索前 N 個(在本例中為兩個)最古老個體的方法。 第一個採用 UNION ALL
方法,而第二個採用行編號以獲得更具可擴展性的解決方案。
方法1:UNION ALL(適合數量較少、固定數量的組別)
對於已知且數量有限的群組來說,此方法非常簡單。 它從每個組中單獨選擇前 N 個最古老的個體並將結果組合起來。 然而,隨著組別數量的增加,這種方法變得麻煩且低效。
( SELECT * FROM mytable WHERE `group` = 1 -- Group 1 ORDER BY age DESC LIMIT 2 ) UNION ALL ( SELECT * FROM mytable WHERE `group` = 2 -- Group 2 ORDER BY age DESC LIMIT 2 ) -- ... Add more UNION ALL clauses for additional groups
方法 2:行編號(針對大量或未知數量的組別的可擴展解決方案)
此方法為各自組別中的每個人動態分配行號,按年齡降序排列。 這樣可以有效地選擇所有群體中前 N 個最年長的個體。
SELECT person, `group`, age FROM ( SELECT person, `group`, age, (@num:=IF(@group = `group`, @num +1, IF(@group := `group`, 1, 1))) AS row_number FROM test t CROSS JOIN (SELECT @num:=0, @group:=NULL) c ORDER BY `group`, Age DESC, person ) AS x WHERE x.row_number <= 2 -- Select the top 2 from each group
此方法利用變數 @num
和 @group
分別追蹤行號和群組。 CROSS JOIN
初始化這些變數。 最後的 WHERE
子句過濾結果,僅包含每組中排名前 2 的個體。 對於具有多個組的資料集,此方法比 UNION ALL
方法顯著更有效率且適應性更強。
以上是如何從數據集中的每個組中檢索最大的最大的人?的詳細內容。更多資訊請關注PHP中文網其他相關文章!