3

以前に計算したポイントで生徒をランク付けしようとしていますが、問題は、生徒が同じポイントを持っている場合、両方が同じランクになる必要があることです。

生徒 1 は満点 生徒 2 は満点

どちらもランク 1 である必要があります。

ここに画像の説明を入力 これが私のデータベースの例です

私がやろうとしているクエリは(選択のためだけに、列に値を挿入できます)

 SELECT  a.points
        count(b.points)+1 as rank
FROM  examresults a left join examresults b on a.points>b.points
group by  a.points;

より明確にするために編集します。

  • 学生 1点 80
  • 学生 2点 77.5
  • 学生 3点 77.5
  • 学生 4点 77

彼らのランクは次のようになるはずです

  • 生徒 1 ランク 1
  • 学生 2 ランク 2
  • 学生 3 ランク 2
  • 学生 4 ランク 3

私の現在のクエリは次のような値を返します

ここに画像の説明を入力

3位が抜けているので。(2 位には 2 つの値があるため)

4

3 に答える 3

2

これは、変数を使用した Gordon ソリューションの単なる修正です。問題は、ランク関数がランクが機能する方法ではないということです。(学生4はランク4であるべきです)

SQL Fiddle Demo 学生を追加して、テストを改善できます。

select er.*,
       (@rank := if(@points = points, 
                    @rank, 
                    if(@points := points,    
                       @rank + 1, 
                       @rank + 1                       
                      )
                   )                  
       ) as ranking
from students er cross join
     (select @rank := 0, @points := -1) params
order by points desc;

出力

| id | points | ranking |
|----|--------|---------|
|  1 |     80 |       1 |
|  2 |     78 |       2 |
|  3 |     78 |       2 |
|  4 |     77 |       3 |
|  5 |     66 |       4 |
|  6 |     66 |       4 |
|  7 |     66 |       4 |
|  8 |     15 |       5 |
于 2016-01-06T20:11:23.943 に答える
1

ANSI 標準rank()関数によって計算される実際のランクが必要です。このロジックを使用して、MySQL でこれを実装できます。

select er.*,
       (select 1 + count(*)
        from examresults er2
        where er2.points > er.points
       ) as ranking
from exampleresults er;

より大きなテーブルの場合、変数を使用してこれを行うことができますが、かなり厄介です:

select er.*,
       (@rank := if(@rn := @rn + 1              -- increment row number
                    if(@points = points, @rank, -- do not increment rank
                       if(@points := points,    -- set @points
                          @rn, @rn              -- otherwise use row number
                         )
                       )
                   )
       ) as ranking
from examresults er cross join
     (select @rn := 0, @rank := 0, @points := -1) params
order by points desc;
于 2016-01-06T16:31:43.787 に答える
0

このクエリは、あなたが望むものを達成します:

SELECT  student_id , points, (select count(distinct(points))+1 as rank 
from examresults internal 
where internal.points > external.points order by points)
FROM  examresults external 
group by  student_id
于 2016-01-06T16:49:37.240 に答える