2017-04-10 76 views
0

所以,我的问题是插入在这种情况下: 我有一个系统来管理课外课程的学生申请。这些应用程序存储在一个表具有以下结构:选择最近的行

  • StudentId:学生[主键]的ID
  • CourseId:课程[主键]
  • 的id状态验证日期:验证应用程序状态的日期[主键]
  • 状态:当前应用程序状态(可以是“正在进行”,“拒绝”,“已完成”)

我的问题是:对于每个学生和课程,我需要获取最近的一行。

StudentId CourseId StatusVarificationDate  Status 
1   1001  2011-12-12 07:27:24 In Progress 
1   1001  2011-12-12 09:27:24 In Progress 
1   1002  2011-12-13 15:27:24 Admited 
2   1001  2011-12-12 09:27:24 In Progress 
2   1001  2011-12-12 15:27:24 Admited 

通过上面的例子,我怎么能得到这样的结果?

StudentId CourseId StatusVerificationDate  Status 
1   1001  2011-12-12 09:27:24 In Progress 
1   1002  2011-12-13 15:27:24 Admited 
2   1001  2011-12-12 15:27:24 Admited 
+0

https://i.imgur.com/lUmelWO.png好的,然后 – Sebas

+0

我是新来的,对不起,下次我会发布我的尝试。 –

回答

0

使用ROW_NUMBER()如下分区:使用row_number()

;With T AS 
(
    SELECT 
     *,   
     ROW_NUMBER() OVER(PARTITION BY StudentId,CourseId ORDER BY StatusVarificationDate DESC) AS PartNo 
    FROM @tblTest 
) 
SELECT 
    * 
FROM T 
WHERE PartNo=1 
+0

我认为应该是'PARTITION BY StudentId,CourseId' – TriV

+0

是@Triv我的错误,感谢您的更正 –

+0

感谢您的快速回复。我没有太多的SQL经验,所以'分区'对我来说是新的。你能给我一个简单的解释,说明你为什么在这个查询中使用这个关键字吗? –

0

使用MAX聚合函数JOIN声明:

SELECT * 
FROM table1 
JOIN 
(
    SELECT StudentId, CourseId MAX(StatusUpdateDate) Maxdate 
    FROM table1  
) A ON A.Maxdate = StatusUpdateDate AND A.StudentId = table1.StudentId 
1

这通常是处理:

select t.* 
from (select t.*, 
      row_number() over (partition by StudentId, CourseId 
           order by StatusVarificationDate desc 
           ) as seqnum 
     from t 
    ) t 
where seqnum = 1;