需要从完成中获得第一个成功完成日期

问题描述

我的数据如下所示:

StuId StuName Exam Attempt score
1       Sam   Eng  1       45
1       Sam   Eng  2       58
1       Sam   Eng  3       63
2       Mat   Eng  1       65
2       Mat   Eng  2       75

如果学生的分数超过 60 分,他就通过了。我想为每个学生获取一个成功的尝试并忽略所有其他尝试 我的预期结果集如下所示:

StuId   StuName Exam Attempt score
       
     1       Sam   Eng  3       63
     2       Mat   Eng  1       65

有没有办法在 sql Server 中实现这一点?

解决方法

您可以使用 where 子句过滤掉不成功的尝试,然后使用 row_number 为每个学生的每次尝试分配一个标识符,并选择第一个:

SELECT StuId,StuName,Exam,Attempt,Score
FROM   (SELECT StuId,Score,ROW_NUMBER() OVER (PARTITION BY StuId,Exam ORDER BY Attempt) AS rn
        FROM   exams
        WHERE  Score >= 60) t
WHERE  rn = 1
,

您也可以为此使用聚合:

select stuid,stuname,max(exam) keep (dense_rank first order by attempt) as exam,min(attempt),max(score) keep (dense_rank first order by attempt) as score
from exams
where score >= 60;

keep 语法是 Oracle 实现“第一个”聚合函数的(花哨的?冗长的?)方式。