2016-11-08 51 views
0

我有一个分贝,看起来像这样SQL Server 2008中,选择学生成绩优异的学生,从每一类

+--------+-------+-------+ 
| ID  | Class | grade | 
+--------+-------+-------+ 
| 123 | A | 100 | 
| 2  | B | 84 | 
| 357 | A | 46 | 
| 43  | B | 12 | 
| 55677 | B | 78 | 
| 63432 | A | 63 | 
+--------+-------+-------+ 

很明显,我处理的更大分贝。 更多学生和更多课程 我想实现的是从每个班级中挑选两名成绩最高的学生。

所以,它应该显示:

+-------+-------+-------+ 
| ID | Class | Grade | 
+-------+-------+-------+ 
| 123 | A  | 100 | 
| 63432 | A  | 63 | 
| 2  | B  | 84 | 
| 55677 | B  | 78 | 
+-------+-------+-------+ 

如何做到这一点谢谢!

我尝试这样做,但它给了我所有行

select id, class, max(grade) 
from school 
group by id, class 

++++

有,我想这个数据库做另一件事。 我如何才能从每班上拉10%的学生? 后,我加了一个等级的属性,我尝试使用这样的“具有”组后:

rank < count(distinct ID) * 0.05 

谢谢!

+0

如果有在第二位的领带?即将(321,B,78)添加到样本表数据中。 – jarlh

回答

2

使用ROW_NUMBER()功能与分区的子句。

;WITH CTE AS (

SELECT id, Class, Grade, 
     ROW_NUMBER() OVER(PARTITION BY Class ORDER BY Grade DESC) as rnk 
FROM tableName 
) 

SELECT id, Class, Grade 
FROM CTE 
WHERE rnk <=2 
+0

'ROW_NUMBER'不会为同一年级的学生生成相同的排名。 – Wanderer

+0

你知道一种方法来从每班上拉10%的学生吗?谢谢! – Nayana

+0

http://stackoverflow.com/questions/7579916/how-do-i-select-top-5-percent-from-each-group –

0

我认为,DENSE_RANKROW_NUMBER更好地在这里。

查询

;with cte as(
    select [rank] = dense_rank() over(
     partition by [Class] 
     order by [grade] desc 
    ), * 
    from [your_table_name] 
) 
select * from cte 
where [rank] <= 2; 
+0

你是如何按照你所做的方式排列数据库的?我总是用很多空格来排列数字。你是怎么做的 - - |这东西?它看起来好多了,谢谢你编辑我的问题。 – Nayana

+0

你知道一种方法来从每班上拉10%的学生吗?谢谢! – Nayana

0

试试这个:

WITH result AS (

SELECT Id, Class, Grade, 
     dense_rank() OVER(PARTITION BY Class ORDER BY Grade DESC) as DenseRank 
FROM tableName 
) 

SELECT Id, Class, Grade 
FROM result 
WHERE DenseRank <=2 

多个学生用同一档次最高的也将予以考虑。

+0

你知道一种方法来从每班上拉10%的学生吗?谢谢! – Nayana

0

为此,你需要通过使用组,并具有:

select id,Class,Grade 
    from Student e 
    where Grade=(select max(Grade) 
    from Student w 
    group by w.Class having e.class=w.class) 
相关问题