首頁 >資料庫 >mysql教程 >如何從分組數據中有效提取最高的N記錄?

如何從分組數據中有效提取最高的N記錄?

Barbara Streisand
Barbara Streisand原創
2025-01-25 10:05:09268瀏覽

How to Efficiently Extract the Top N Records from Grouped Data?

高效提取分組數據中的頂級記錄

假設有一個結構化數據集,包含人員、分組和年齡等列,本文探討如何根據年齡在每個分組中獲取前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中文網其他相關文章!

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