在组内排序

时间:2015-01-28 02:57:55

标签: sql sql-server sql-server-2008

我在sql server 2008上有一个学生表,其中包含以下列:

StudentID   name    SubjectID   lastUpdatedDate
-------------------------------------------------------
100         abc     01          2013-03-12 04:59:06.430
110         bbc     01          2013-03-12 03:59:06.430
120         cbc     02          2013-03-12 04:58:08.320
130         dbc     03          2013-03-12 02:58:11.320
140         ebc     02          2013-03-12 04:59:06.430

SubjectID指的是主题查找表:

SubjectID | SubjectDescription......

我想列出每个主题类型的最后修改过的学生记录 最后修改的记录由lastUpdatedDate的降序确定。

所以 - 上述数据的结果应该是:

100     abc     01  2013-03-12 04:59:06.430
130     dbc     03  2013-03-12 02:58:11.320
140     ebc     02  2013-03-12 04:59:06.430

有没有办法不创建临时表?

2 个答案:

答案 0 :(得分:1)

您可以获取每个SubjectID的最新更新日期,然后使用INNER JOIN过滤原始表格中的结果:

SELECT t1.* 
FROM tbl t1
JOIN ( SELECT SubjectID
            , MAX(lastUpdatedDate) AS lastUpdatedDate
       FROM tbl 
       GROUP BY SubjectID ) t2 ON t1.SubjectID =  t2.SubjectID
                              AND t1.lastUpdatedDate =  t2.lastUpdatedDate

答案 1 :(得分:1)

select StudentId, name, SubjectId, lastUpdateDate
from (select *
        , row_number() over (partition by StudentId 
             order by lastUpdate desc) as RN
     from Students) S
where RN = 1

使用窗口函数通常会比使用聚合和自联接的等效查询看到更好的性能。

注意,对于lastUpdateDate的tie,可以任意选择一个。如果您希望获胜的所有行,请使用rank()代替row_number()