2013年7月16日 星期二

ROW_NUMBER 的用法



圖一:來源資料










注:date是varchar(10)


問題描述:
版號(VerNO) > 001就是有新增變更單
要判斷:
生效日期(Date)是否大於當天
大於今天取前一筆 版號 日期資料
小於等於就最新版號資料
沒變更單就用最初始版號資料

圖二:要得出的結果








------------------------------------------------------------------------------------------------------------
首先語法是這樣
ROW_NUMBER ( )
OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
接下來利用
SELECT ROW_NUMBER() OVER(PARTITION BY ProdID ORDER BY ProdID DESC,Date DESC) AS rownumber ,*
FROM Table
WHERE isnull(Date,'') < CONVERT(VARCHAR(10), getdate(), 111)

會得到下列的結果

圖三:排序後的結果

說明:

PARTITION BY ProdID :
就是以PordID去做資料分割,不同的資料分割會有不同的序號,從1開始。

ORDER BY ProdID DESC,Date DESC:
使用 ProdID,Date 去做排序,如此一來日期最大,且日期小於今日的rownumber會等於1

CONVERT(VARCHAR(10), getdate(), 111):
取得今日的日期 2013/07/15


接下來只要指定得到rownumber=1的資料就是我們要的結果了。
SELECT T1.ProdID, T1.VerNO, T1.Date
FROM (
      SELECT ROW_NUMBER() OVER(PARTITION BY ProdID ORDER BY ProdID DESC,date DESC) AS rownumber ,*
      FROM Table
      WHERE isnull(Date,'') < CONVERT(VARCHAR(10), getdate(), 111)
     )T1
WHERE T1.rownumber =1

不過這函數SQL Server 2005以上才有支援

參考資料:http://technet.microsoft.com/zh-tw/library/ms186734.aspx

沒有留言:

張貼留言