2017-04-10 242 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;