2016-09-26 8 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 

だろうが、私は、パラメータとして3のオフに基づいて

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

になるためにそれらを必要とするでしょう。任意のヘルプ

+2

それはあなたが実際にあなたの元データ、処理ルールと所望の出力を達成するために何をしようとしているのですか?あなたが解決策の途中にいるように見えて、完了方法を今聞いていますが、まったく異なる解決策が望ましいかのように見えます。 – iamdave

+0

適切なソフトウェア(MySQL、Oracle、DB2など)とバージョンの両方でデータベースの質問にタグを付けると便利です。 'sql-server-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

関連する問題