需要从完成中获得第一个成功完成日期
Need to get first successful completion date from completions
我的数据是这样的:
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 服务器中实现这一点?
您可以使用 where
子句过滤掉不成功的尝试,然后使用 row_number
为每个学生的每次尝试分配一个标识符,并选择第一个:
SELECT StuId, StuName, Exam, Attempt, Score
FROM (SELECT StuId, StuName, Exam, Attempt, 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 的(花哨?冗长?)实现“第一个”聚合函数的方式。
我的数据是这样的:
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 服务器中实现这一点?
您可以使用 where
子句过滤掉不成功的尝试,然后使用 row_number
为每个学生的每次尝试分配一个标识符,并选择第一个:
SELECT StuId, StuName, Exam, Attempt, Score
FROM (SELECT StuId, StuName, Exam, Attempt, 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 的(花哨?冗长?)实现“第一个”聚合函数的方式。