mysql SQL:下降超过2个级别的等级

brc7rcf0  于 2023-01-16  发布在  Mysql
关注(0)|答案(1)|浏览(106)

我正在做一些报告,它将标记学生的成绩是否下降了2个或更多的年级段,但似乎不能让查询工作。
我将下面的数据简化为一个例子:
| 检查|学生编号|检查日期|级别|
| - ------|- ------|- ------|- ------|
| 生物01 a|AA002|二〇二二年十月二十日|B|
| 生物01 b|AA002|2023年1月10日|A类|
| Phy01a|AA009|二〇二二年十月二十日|B|
| Phy 01 b基因|AA009|二〇二二年十一月十日|E级|
| Phy01a|AA003|二〇二二年十月二十日|D级|
| Phy 01 b基因|AA003|二〇二二年十一月十日|A类|
| 生物01 a|AA004|二〇二二年十月二十日|C级|
| 生物1b|AA004|2023年1月10日|F级|
根据上面的示例,我希望查询将结果
Phy 01 b/AA 009疫苗
生物1b/AA 004
因为最近的考试成绩符合退学标准。最初的成绩是多少并不重要,只要最近的成绩和以前的成绩相差2分或更多就行了。
手动操作时,我考虑了将字母等级转换为数字(G=1,A=7),然后从最旧的值中减去最新的值,如果结果〈= -2,则等级下降2个或更多等级,但我只是不确定如何将其转换为查询。等级边界不统一,因此无法使用等级的实际得分。
它是沿着where max(ExamDate),Grade as grade 1 AND where max(ExamDate),Grade as grade 2 AND where grade 1-grade 2〈= -2的路线,但我无法理解它

t3irkdon

t3irkdon1#

假设一名学生不能多次使用同一个ExamDate,则应执行以下操作:

select Exam, StudentID, ExamDate, Grade, PreviousGrade
from table t1
left join 
    (
    select Grade as 'PreviousGrade', StudentID, 
    ROW_NUMBER OVER (PARTITION BY StudentID ORDER BY ExamDate) as row_num
    from table
    having row_num = 2
    ) a
on table.StudentID = a.StudentID
where ascii(Grade) - ascii(PreviousGrade) >= 2
and ExamDate = 
     (
     Select max(ExamDate) 
     from table t2 
     where t1.StudentID = t2.StudentID
     )

它利用ascii()函数将字母等级转换为它们的ascii值,该值在数字上递增('A' = 65,'B' = 66,等等...)
使用row_number允许我们查找第二个最近的考试日期,方法是使用partition by子句为每个学生分配一个row_number(1表示最近的考试日期,2表示第二个最近的考试日期,依此类推)。

相关问题