2016-05-12 20 views
0

Ich habe verschiedene Arten von Typen und rangierte sie entsprechend ihre Spuren mit:Rang nach Buchstaben in der Tabelle mit SQL/Rang/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; 

und das Ergebnis ist:

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 

jedoch Was ich versuche nach ihren Qualitäten zu erreichen, ist es, diese Leute Rang und nicht nach ihren Marken:

So

Was ich versuche zu erreichen, ist wie folgt:

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 

Wie kann ich das erreichen? Danke,

+0

Ich denke, der einfachste Weg, dies zu tun wäre, einen Tabellenwertparameter zu erstellen, in dem Sie manuell Reihen zuweisen zu HDs (also, 2 Spalten), dann nur diese Tabelle zu Ihrer ersten Tabelle auf dem "Grade" -Feld beitreten. Ich würde versuchen, es aufzuschreiben, aber ich bin nicht mit PostgreSQL-Syntax vertraut. – Sturgus

Antwort

0

Wenn es hilft, würde ich Folgendes in SQL Server verwenden. Vielleicht können Sie (oder jemand) es übersetzen?

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

Sie sollten in der Lage sein, dies zu tun, die in Oracle und SQL Server funktioniert:

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

Oder in diesem Fall, direkt ', Fall, wenn grad ... dann 5 als Rang beenden', d. H. Der dose_rank() wird sinnlos –

+1

Wahr und am besten nicht zu verwenden, wenn nicht benötigt. Oben bearbeitet, danke! – mo2