3

T-SQLに非常に特有の問題があります。

この例のケースを解決できれば、元のケースを解決できると思います。

このデータをテーブルに入れる:

DECLARE @Test TABLE
(
    Value INT
    ,Date DATETIME2(7)
);

INSERT INTO @Test
VALUES
(NULL, '2011-01-01 10:00'),
(NULL, '2011-01-01 11:00'),
(2, '2011-01-01 12:00'),
(NULL, '2011-01-01 13:00'),
(3, '2011-01-01 14:00'),
(NULL, '2011-01-01 15:00'),
(NULL, '2011-01-01 16:00'),
(4, '2011-01-01 17:00'),
(NULL, '2011-01-01 18:00'),
(5, '2011-01-01 19:00'),
(6, '2011-01-01 20:00')

この出力を選択する必要があります:

Value   Date
2       2011-01-01 10:00
2       2011-01-01 11:00
2       2011-01-01 12:00
2       2011-01-01 13:00
3       2011-01-01 14:00
3       2011-01-01 15:00
3       2011-01-01 16:00
4       2011-01-01 17:00
4       2011-01-01 18:00
5       2011-01-01 19:00
6       2011-01-01 20:00

説明するため。値がどこかでNULLの場合、前の1時間の値で更新する必要があります。行に複数のnull値がある場合、null以外の値を持つ最も近い前の時間に伝播し、これらすべてのnull値を埋めます。また、その日の最初の時間がnullの場合、null以外の値を持つその日の最も早い時間は、この場合は2のように下向きに伝播します。あなたの場合、少なくとも1つの値がnull以外の値であると想定できます。

私の野心は、一般的なテーブル式などでこれを解決することです。カーソルの方法で試してみると、短時間で解決策が得られると思いますが、CTEと再帰CTEでの試みはこれまで失敗しました。

4

2 に答える 2

3

あなたの状態はいつも同じではないので、これはもう少し難しいです。この例では、最初の2行は、後の日付の最初の値から値を取得する必要があります。それ以外の場合は、前の日付の値を取得する必要があります。以前の日付を常に確認する必要がある場合は、次のクエリを実行するだけです。

SELECT  B.Value,
        A.[Date]
FROM @Test A
OUTER APPLY (SELECT TOP 1 *
             FROM @Test
             WHERE [Date] <= A.[Date] AND Value IS NOT NULL
             ORDER BY [Date] DESC) B

しかし、あなたの場合、代わりにこれが必要だと思います。

SELECT  ISNULL(B.Value,C.Value) Value,
        A.[Date]
FROM @Test A
OUTER APPLY (SELECT TOP 1 *
             FROM @Test
             WHERE [Date] <= A.[Date] AND Value IS NOT NULL
             ORDER BY [Date] DESC) B
OUTER APPLY (SELECT TOP 1 *
             FROM @Test
             WHERE Value IS NOT NULL
             ORDER BY [Date]) C
于 2012-05-18T14:41:09.797 に答える
2

これを試して:

select 
    t.value, t.date
      ,COALESCE(t.value
               ,(select MAX(tt.value) from @Test tt WHERE t.Date>tt.Date)
               ,(SELECT MIN(ttt.Value) FROM @Test ttt Where ttt.Date IS NOT NULL)
               ) AS UseValue
    from @Test   t

出力:

value       date                    UseValue
----------- ----------------------- -----------
NULL        2011-01-01 10:00:00.000 2
NULL        2011-01-01 11:00:00.000 2
2           2011-01-01 12:00:00.000 2
NULL        2011-01-01 13:00:00.000 2
3           2011-01-01 14:00:00.000 3
NULL        2011-01-01 15:00:00.000 3
NULL        2011-01-01 16:00:00.000 3
4           2011-01-01 17:00:00.000 4
NULL        2011-01-01 18:00:00.000 4
5           2011-01-01 19:00:00.000 5
6           2011-01-01 20:00:00.000 6
于 2012-05-18T14:49:03.533 に答える