2016-01-25 47 views
0

Ms SQL Server。表中的歷史'分片'

我有一張表,用於監視學生的學校申請狀態。 學生可以申請多個學校,每個學校都可以接受/拒絕/等待學生的名單。

tblApplicantSchools會是這個樣子:

ApplicantID | SchoolID  |  StatusID 

獨特的申請者可以出現在這裏申請多所學校 - 但每個學校的申請之一的地位。

我也有一個歷史性的表tblApplicantSchools_shadow,它會影響tblApplicantSchools上所做的任何更改。它與上面的內容相同,只是它還節省了更改的時間,以及它是否是原始表上的插入/更新/刪除。 因此,在他shadow表中,可能有多個學生,有多個狀態的多個學校(當他們在整個過程中移動時)。

我想要做的是將shadow表格分到一定的日期,並將每個申請的單個最近的statusID帶到每個申請人的每個學校。這有意義嗎? 例如:

ApplicantID | SchoolID  |  StatusID  | ChangeDate 
----------------------------------------------------------------------- 
    11     2     3     22/1/2015 
    11     2     4     30/1/2015 
    11     3     4     25/1/2015 
    11     3     6     29/1/2015 

所以,我希望看到的是僅列#2和上面第4,被視爲他們的申請#11到每個學校的最近期更新。

有人能給我一個關於如何做到這一點的指針嗎?我的設置稍微複雜一些,但我認爲這個例子簡化了它,這樣問題就很清楚了。

感謝

回答

1

如果你希望一個ANSI-92標準的解決方案,或者如果你怕的窗口功能,那麼這個查詢可能是有用的:

SELECT s1.ApplicantID, s1.SchoolID, s1.StatusID, s1.ChangeDate 
FROM shadow s1 
INNER JOIN 
(
    SELECT ApplicantID, SchoolID, MAX(ChangeDate) AS maxDate 
    FROM shadow 
    GROUP BY ApplicantID, SchoolID 
) s2 
ON s1.ApplicantID = s2.ApplicantID AND s1.SchoolID = s2.SchoolID 
    AND s1.ChangeDate = s2.maxDate 
2

你可以使用窗口函數ROW_NUMBER

SELECT * 
FROM (SELECT *, rn = ROW_NUMBER() OVER(PARTITION BY ApplicantID,SchoolID 
             ORDER BY ChangeDate DESC) 
     FROM tblApplicantSchools_shadow) AS sub 
WHERE rn = 1; 

LiveDemo

輸出:

╔═════════════╦══════════╦══════════╦═════════════════════╗ 
║ ApplicantID ║ SchoolID ║ StatusID ║  ChangeDate  ║ 
╠═════════════╬══════════╬══════════╬═════════════════════╣ 
║   11 ║  2 ║  4 ║ 2015-01-30 00:00:00 ║ 
║   11 ║  3 ║  6 ║ 2015-01-29 00:00:00 ║ 
╚═════════════╩══════════╩══════════╩═════════════════════╝ 

請記住,如果ChangeDate只是DATE(沒有時間標準,有可能會打平,您應該使用RANK()來代替。與DATETIME平局的概率很低。

+1

這肯定看起來像是我想學習,謝謝。看起來很強大。現在太多太多了,我們正在尋找另一種更加不錯的解決方案。 – kneidels