我在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
有没有办法不创建临时表?
答案 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()
。