[英]MySQL : getting top 100 records for each category
我有一個表: consultant_project_score
,它具有以下字段id
, project_id
和final_score
。 我想生成一個查詢,其中顯示每個project_id的前100個final_score。 我正在使用MySQL workbench 6.3
,但無法使用任何create/insert
語句。 有什么辦法可以做到這一點?
未經測試,但應該可以。竅門是為每個項目生成一個行號
select id, project_id, final_score
from
(select id, project_id, final_score,
@rn:= if(@project_id= project_id, @rn+ 1, 1) as rn,
@project_id:= project_id as pi
from t,(SELECT @rn:=0) b
order by project_id, final_score desc) x
where x.rn<= 100;
這將為您工作。 內部查詢將按project_id
生成排名組,然后外部查詢將過濾前100個結果。
注意:如果您具有project_id和score的類似組合,則該方法將無效。 創建了這個小提琴以獲得2個等級。
http://sqlfiddle.com/#!9/9e94d5/1
SELECT id1,
project_id,
final_score
FROM
(SELECT max(t1.id) AS id1,
t1.project_id,
t1.final_score,
count(*) AS rnk
FROM consultant_project_score t1
INNER JOIN consultant_project_score t2 ON t1.project_id=t2.project_id
WHERE t1.final_score<=t2.final_score
GROUP BY t1.project_id,
t1.final_score) t
WHERE rnk<=100
這是沒有Group BY
並使用self join
的概念。 這應該給您正確的輸出
SQL
SELECT cps2.id, cps2.project_id, cps2.final_score FROM
( SELECT DISTINCT project_id FROM consultant_project_score ) cps1
JOIN consultant_project_score cps2
ON cps2.id IN ( SELECT cps3.id FROM consultant_project_score cps3
WHERE cps3.project_id = cps1.projectid
ORDER BY cps3.final_score DESC LIMIT 100)
ORDER BY cps2.project_id ,cps2.final_score DESC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.