2016-05-12 53 views
0

我有不同的等级,并使用他们排名相应调整至其刻度:根据使用SQL /等级/ DENSE_RANK()表字母排序

select id,subject,semester,student,course,mark,grade 
,dense_rank() over(PARTITION by course order by mark desc) as RANK 
from courses c 
LEFT JOIN course_enrolments b ON c.id=b.course; 

,其结果是:

id subject semester student course mark grade rank 
5270 1001 126 1077055 5270 99  HD 1 
5270 1001 126 1076079 5270 98  HD 2 
5270 1001 126 1077334 5270 85  HD 3 
5270 1001 126 1076920 5270 84  DN 4 
5270 1001 126 1077443 5270 84  DN 5 
5270 1001 126 1072135 5270 67  CR 6 
5270 1001 126 1079997 5270 66  CR 7 
5270 1001 126 1071034 5270 62  PS 8 
5270 1001 126 1079993 5270 62  PS 9 
5270 1001 126 1074070 5270 44  FL 10 
5270 1001 126 1078409 5270 30  FL 11 
5270 1001 126 1073006 5270 28  FL 12 

但是我试图做到的是排列这些人根据自己的成绩没有按照他们的标志

所以我试图做到的,是这样的:

id subject semester student course mark grade rank 
5270 1001 126 1077055 5270 99  HD 1 
5270 1001 126 1076079 5270 98  HD 1 
5270 1001 126 1077334 5270 85  HD 1 
5270 1001 126 1076920 5270 84  DN 2 
5270 1001 126 1077443 5270 84  DN 2 
5270 1001 126 1072135 5270 67  CR 3 
5270 1001 126 1079997 5270 66  CR 3 
5270 1001 126 1071034 5270 62  PS 4 
5270 1001 126 1079993 5270 62  PS 4 
5270 1001 126 1074070 5270 44  FL 5 
5270 1001 126 1078409 5270 30  FL 5 
5270 1001 126 1073006 5270 28  FL 5 

我怎样才能做到这一点? 谢谢,

+0

我认为这样做是创建一个表值参数来手动指定行列的最简单方法到HD(如此,2列),然后将该表加入到您的第一张表格“等级”栏中。我会试图写出来,但我不熟悉PostgreSQL语法。 – Sturgus

回答

0

如果有帮助,我会在SQL Server中使用以下内容。也许你(或某人)可以翻译它?

DECLARE @GradeRankTVP Table (
    Grade Varchar(2), 
    GradeRank int 
); 
INSERT INTO @GradeRankTVP (Grade, GradeRank) VALUES 
    (HD, 1) 
    ,(DN, 2) 
    ,(CR, 3) 
    ,(PS, 4) 
    ,(FL, 5) 
-- ,etc 
; 
select c.id, c.subject, c.semester, b.student, c.course, b.mark, b.grade 
, d.GradeRank 
from courses c 
LEFT JOIN course_enrolments b ON c.id = b.course 
LEFT JOIN @GradeRankTVP AS d on b.grade = d.Grade 
1

你应该能够做到这一点,其在Oracle和SQL Server的工作原理:

select id,subject,semester,student,course,mark,grade, 
case when grade = 'HD' then 1 
    when grade = 'DN' then 2 
    when grade = 'CR' then 3 
    when grade = 'PS' then 4 
    when grade = 'FL' then 5 
end as RANK 
from courses c 
order by mark desc 
+1

或者在这种情况下,直接',当grad时......然后5结束为rank',即dense_rank()变得毫无意义 –

+1

真的,最好不要在不需要时使用它。上面编辑,谢谢! – mo2