我正在制作一个报告,在其中需要显示学生证,分数和提交分数的最低日期/时间。该表将在多天内为每个学生提供多个分数。
我遇到的问题(使用下面的示例代码)是我为每个分数获得了新的一行,而不是每个学生只有一行显示学生ID,分数和日期。
student_id |得分|分数日期
select tests.student_id
,tests.score
,min(score_date)
from tests
group by tests.student_id
,tests.score
尝试一下。
SELECT student_id, score, score_date
FROM tests T
INNER JOIN (SELECT student_id, Min(score_date) AS score_date FROM tests) X
ON T.student_id = X.student_id AND T.score_date = X.score_date
您为此使用row_number()
。
select * from (
select t1.student_id
,t1.score
,row_number() over (partition by t1.student_id order by t1.score_date) rn
,t1.score_date
from tests t1) t
where t.rn = 1
使用correlated subquery
还有一个窍门。
select student_id
, min(score_date) score_date
, (select top 1 score from tests where score_date = min(t.score_date) and student_id = t.student_id) as score
from tests t
group by student_id
或者如果您正在使用sql server 2012和更高版本。您可以最大限度地利用first_value()
功能。
select distinct first_value(student_id) over (partition by student_id order by score_date)
, first_value(score_date) over (partition by student_id order by score_date)
, first_value(score) over (partition by student_id order by score_date)
from tests t
group by student_id