2017-05-28 28 views
2

我正在使用SQL Server數據庫。通過返回太多行限制最大值和組

鑑於以下查詢,我試圖獲得每個班級的最高分數。 Scores表有兩行50行,所以我總共需要2行。但是,因爲我有Scores.Id,所以它返回Scores的每一行,因爲Scores.Id是唯一的。當然,簡單的解決方案是刪除Scores.Id列,但我需要知道Scores.Id進行其他查找。

SELECT 
    Class_Id, Scores.Id, MAX(Scores.ClassScore) AS Score 
FROM 
    Classes 
INNER JOIN 
    Scores ON Classes.Id = Scores.Class_Id     
GROUP BY 
    Scores.Class_Id, Scores.Id 

回答

3

最高得分的標識碼(class_id)簡直是

select class_id, max(classScore) score from scores 
group by class_id 

然後,如果您需要知道哪些在得分表中的行有最高分可以加入。如果每班有多個相同的最高分數,則可能會得到兩個以上的行。

select id, class_id, classscore from 
scores s 
inner join 
(
    select class_id, max(classScore) score from scores 
    group by class_id 
) 
t 
on t.class_id = s.class_id and t.score = s.classScore 

或者我可能會使用一個CTE

with maxScores as 
(
    select class_id, max(classScore) score from scores 
    group by class_id 
) 
select id, class_id, classscore from 
scores s 
on maxScores.class_id = s.class_id and maxScores.score = s.classScore 
+0

其他的答案都是有效的。有趣的是(對於非常少量的測試數據),我的查詢給出了最新的查詢計劃,但RANK函數提供了最快的查詢(添加索引之後)。 – Phil

3

這是你想要的嗎?

select s.* 
from (select s.*, 
      max(s.classscore) over (partition by s.class_id) as max_classscore 
     from scores s 
    ) s 
where classscore = max_classscore; 

鑑於您需要的信息,加入到Classes是多餘的。

2

這看起來像對rank窗口功能的工作:

SELECT Class_Id, Id, Score 
FROM (SELECT Class_Id, Scores.Id AS Id, Score, 
       RANK() OVER (PARTITION BY Class_Id, Scores.Id 
          ORDER BY Score DESC) AS rk 
     FROM Classes 
     JOIN Scores ON Classes.Id = Scores.Class_Id) t 
WHERE rk = 1