2016-11-08 96 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)