高效提取分組數據中的頂級記錄
假設有一個結構化數據集,包含人員、分組和年齡等列,本文探討如何根據年齡在每個分組中獲取前N個個體。
預期結果:
目標是在每個組中檢索年齡最大的兩個個人,如果年齡相同則按姓名字母順序排列。
現有解決方案:
先前的方法(受@Bohemian提出的查詢啟發)為每個組檢索單個頂級行:
<code class="language-sql">select * from (select * from mytable order by `Group`, Age desc, Person) x group by `Group`</code>
使用UNION的增強解決方案:
擴展此功能的一種方法是使用UNION ALL運算符,從而能夠為每個組檢索指定數量的記錄:
<code class="language-sql">( select * from mytable where `group` = 1 order by age desc LIMIT 2 ) UNION ALL ( select * from mytable where `group` = 2 order by age desc LIMIT 2 )</code>
使用行號的替代方法:
另一種方法是為每條記錄生成一個行號,然後根據此行號進行篩選:
<code class="language-sql">select person, `group`, age from ( select person, `group`, age, (@num:=if(@group = `group`, @num +1, if(@group := `group`, 1, 1))) 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;</code>
結論:
根據具體的要求和數據特徵,UNION和行號技術都提供了有效的解決方案,用於在分組結果中檢索頂級記錄。
以上是如何從分組數據中有效提取最高的N記錄?的詳細內容。更多資訊請關注PHP中文網其他相關文章!