2016-09-26 74 views
0

我試圖使用參數更新臨時表中的日期,並查看最後一行數的日期。根據參數和最後一行日期在臨時表中更新日期

DECLARE @multiDayCourseDaysBetween INT = 3; 

CREATE TABLE #Courses(TempId INT IDENTITY(1,1) 
         , [Date] DATE 
         , CourseTypeId INT 
         , OrganisationId INT 
         , Reference VARCHAR(100) 
         , CreatedByUserId INT 
         , CourseTypeCategoryId INT 
         , TrainersRequired INT); 

CREATE TABLE #TempDates(TempId INT 
         , [Date] DATE 
         , LagDate DATE); 

INSERT INTO #Courses([Date]) 
Values('2016-06-01') 

INSERT INTO #Courses([Date]) 
Values('2016-06-02') 

INSERT INTO #Courses([Date]) 
Values('2016-06-03') 

INSERT INTO #TempDates(tempId, [date], LagDate) 
SELECT TempId, [Date] 
    , LAG(c.[Date],1) OVER (ORDER BY [Date]) as LagDate 
FROM #Courses c 

UPDATE #TempDates 
SET [Date] = DATEADD(dd, @multiDayCourseDaysBetween, LAG([Date],1) OVER (ORDER BY [Date])) 
WHERE LagDate IS NOT NULL 

但我收到一個錯誤 - '窗口函數只能出現在SELECT或ORDER BY子句中。

例如原來的日期將是

2016-06-01 
2016-06-02 
2016-06-03 

但我需要他們

2016-06-01 
2016-06-04 
2016-06-07 

基於關閉的3作爲一個參數就成。

感謝所有幫助

+2

它是什麼,你實際上是試圖實現的,與你的源數據,處理規則和期望的輸出?看起來你已經獲得了一個解決方案的一半,現在正在問我們如何完成它,而看起來好像完全不同的解決方案會更好。 – iamdave

+0

使用合適的軟件(MySQL,Oracle,DB2,...)和版本(例如, '的SQL服務器2014'。語法和功能的差異往往會影響答案。 – HABO

回答

1

嘗試將最後陳述的東西象下面這樣:

WITH b AS (
SELECT 
    TempId 
    , [Date] 
    , FIRST_VALUE([Date]) OVER (ORDER BY [Date]) as FirstDate 
    , ROW_NUMBER() OVER (ORDER BY [Date]) AS rowRank 
FROM 
    #TempDates 
) 
UPDATE b 
SET [Date] = DATEADD(day, (rowRank-1)* @multiDayCourseDaysBetween, FirstDate) 
WHERE 
    rowRank > 1; 
+0

謝謝你! – Dough