sql >> Databasteknik >  >> RDS >> Mysql

Hur man utför grupperad rankning i MySQL

SELECT id_student, id_class, grade,
   @student:=CASE WHEN @class <> id_class THEN 0 ELSE @student+1 END AS rn,
   @class:=id_class AS clset
FROM
  (SELECT @student:= -1) s,
  (SELECT @class:= -1) c,
  (SELECT *
   FROM mytable
   ORDER BY id_class, id_student
  ) t

Detta fungerar på ett mycket enkelt sätt:

  1. Initial fråga är sorterad efter id_class först, id_student andra.
  2. @student och @class initieras till -1
  3. @class används för att testa om nästa uppsättning matas in. Om det tidigare värdet för id_class (som lagras i @class ) är inte lika med det aktuella värdet (som lagras i id_class ), @student är nollställd. Annars ökas den.
  4. @class tilldelas det nya värdet id_class , och den kommer att användas i testet på steg 3 på nästa rad.


  1. Skillnad mellan Oracles plus (+) notation och ansi JOIN notation?

  2. SQL DELETE-syntax – listad av DBMS

  3. Databasalternativ/paketanvändningsrapportering

  4. Hur man väljer från objekttypskolumnen i Oracle 11g?