![]() |
| 圖一:來源資料 |
注:date是varchar(10)
問題描述:
版號(VerNO) > 001就是有新增變更單
要判斷:
生效日期(Date)是否大於當天
大於今天取前一筆 版號 日期資料
小於等於就最新版號資料
沒變更單就用最初始版號資料
------------------------------------------------------------------------------------------------------------
首先語法是這樣
版號(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的資料就是我們要的結果了。
不過這函數SQL Server 2005以上才有支援
就是以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



沒有留言:
張貼留言