SQL显示MIN()列,并显示其他列

问题描述 投票:0回答:2

我正在制作一个报告,在其中需要显示学生证,分数和提交分数的最低日期/时间。该表将在多天内为每个学生提供多个分数。

我遇到的问题(使用下面的示例代码)是我为每个分数获得了新的一行,而不是每个学生只有一行显示学生ID,分数和日期。

示例源表列

student_id |得分|分数日期

select tests.student_id
      ,tests.score
      ,min(score_date)
from tests

group by tests.student_id
        ,tests.score
sql sql-server
2个回答
0
投票

尝试一下。

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

0
投票

您为此使用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
© www.soinside.com 2019 - 2024. All rights reserved.