2016-11-08 1 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 | 
+--------+-------+-------+ 

のように見えるデシベルを持って、私ははるかに大きなデシベルで取り扱っております。 さらに多くのクラス 私が達成したいのは、各クラスから最も高い成績を持つ2人の生徒を選ぶことです。

だから、それは表示される必要があります。

+-------+-------+-------+ 
| 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

2位タイがあるかどうか?私。サンプルテーブルデータに(321、B、78)を加える。 – jarlh

答えて

2

ROW_NUMBER()関数をpartition by節に使用します。

;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_RANKがここROW_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

はこの試してみてください。同じ最高グレード1人の学生よりも

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)