问题描述
我的数据如下所示:
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 实现“第一个”聚合函数的(花哨的?冗长的?)方式。