[SQL] 於多筆重複資料中取得該重複群組中最新一筆資料

  • 122850
  • 0
  • SQL
  • 2013-05-18

摘要:[SQL] 於多筆重複資料中取得該重複群組中最新一筆資料

前言


有時候在資料表設計上可能使用到一個主資料表關連到一個子資料表,主資料表對於子資料表為一對多狀態,例如: 一筆案件主檔會於子進度資料表紀錄該案件的進度狀態,如下

那在這種情況下該如何去知道該筆案件最新的進度狀態是什麼呢? 請看以下範例。

 

範例


在這種情況下我可以先對進度檔建立該案件群組進度排序資料,使用 ROW_NUMBER() 及 Partition By 語法,如下:

Select M_SN,STATUS,CDate,
ROW_NUMBER() Over (Partition By M_SN Order By CDate Desc) As Sort From T_CS

產生以下結果:

此時可以看到查詢出來的條件已經依照CDate做遞減排序並編上序號,我只需要將Sort編號為1的資料撈出來即就是該案件最新的一筆狀態資料,如下:

Select M_SN,STATUS,CDate From (
	Select M_SN,STATUS,CDate,
	ROW_NUMBER() Over (Partition By M_SN Order By CDate Desc) As Sort From T_CS) TMP_S
Where TMP_S.Sort=1

產生以下結果:

最後,雖然我已經取得最新的狀態,但是我必須將主檔的資訊串在一起才能於畫面上讓使用者看到,所以我只要將案件主檔跟以上語法所取得的最新狀態資料 JOIN 在一起就能夠取得該案件最新的完整資料了,如下:

Select TC.SN,TC.CaseName,TS.STATUS,TS.CDate From
	T_CM TC Inner Join (
	Select M_SN,STATUS,CDate From (
		Select M_SN,STATUS,CDate,
		ROW_NUMBER() Over (Partition By M_SN Order By CDate Desc) As Sort From T_CS) TMP_S
	Where TMP_S.Sort=1 ) TS 
On TC.SN=TS.M_SN

產生以下結果:

如此就能夠將案近與進度檔串連並且是最新的狀態。

在這個範例使用了 ROW_NUMBER()  及 Partition By  語法,ROW_NUMBER()  : 能夠將集資料進行排序,序號從1開始,Partition By  : 使用  ROW_NUMBER()  搭配 Partition By 引數能夠將資料集進行分割並且進行排序,序號從1開始。

 

參考資料


ROW_NUMBER (Transact-SQL)

 

 


以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)