おそらく最も効率的なものではないかもしれませんが、うまくいくはずです:
WITH cte
AS (SELECT [Creation Date],
Data,
rn=Row_number() OVER(ORDER BY [Creation Date])
FROM dbo.Table)
UPDATE cte
SET Data = ( ( (SELECT c2.Data
FROM cte c2
WHERE c2.rn = cte.rn - 1)
+ (SELECT c2.Data
FROM cte c2
WHERE c2.rn = cte.rn + 1) ) / 2 )
WHERE Data = 0;
CTE で使用Row_Number
して、 で並べ替えられた連続番号を取得しCreation Date
ます。次に、この数値を使用して、前の値と次の値に従って新しいデータを取得します。
同様のスキーマを使用したデモを次に示しint
ます (私は の代わりに を使用しましたdatetime
):
アップデート
いいものですが、複数の 0 のギャップを処理しません
良いキャッチです。これを考慮して変更されたSQLは次のとおりです。
WITH cte
AS (SELECT [Creation Date],
Data,
rn=Row_number() OVER(ORDER BY [Creation Date])
FROM dbo.Table)
UPDATE cte
SET Data = ( ( (SELECT c2.Data
FROM cte c2
WHERE c2.rn = (SELECT MAX(RN)FROM CTE c3 WHERE c3.RN<cte.RN AND c3.Data<>0))
+ (SELECT c2.Data
FROM cte c2
WHERE c2.rn = (SELECT MIN(RN)FROM CTE c3 WHERE c3.RN>cte.RN AND c3.Data<>0))) / 2 )
WHERE Data = 0;
デモ(5,6 にゼロが連続)