私はNULLをデータで埋める必要があるテーブルを持っています。しかし、前と後の値が同じであれば、NULLを置き換えたいだけです。TSQLは同じ値の間だけNULLを更新します
G ID Val NewValue
a 1 N N
a 2 N N
a 3 NULL NULL -- notice this is the last value of group 'a' so keep NULL and if NULL was the first of the group, keep NULL as well
b 4 P P
b 5 N N
b 6 NULL N -- N before and N after so the new value ='N'
b 7 N N
c 8 N N
c 9 N N
c 10 NULL NULL -- N before but P after so keep NULL
c 11 P P
c 12 N N
c 13 N N
c 14 N N
d 15 P P
d 16 NULL P -- P before and P after (the series) so make 'P'
d 17 NULL P -- P before and P after (the series) so make 'P'
d 18 P P
d 19 N N
私は簡単な部分の解決方法を持っています。以下のクエリができます:
-
IDの
- 正しい結果= 6、16、およびIDの17の
- 誤った結果= 3と10
をだから私の質問は、残りの部分を行う方法ですか?
DECLARE @Table TABLE(
G varchar(1),
ID INT,
Val varchar(2)
)
INSERT INTO @Table VALUES
('a',1,'N'),('a',2,'N'),('a',3, NULL),
('b',4,'P'),('b',5,'N'),('b',6, NULL),('b',7,'N'),
('c',8, 'N'),('c',9, 'N'),('c',10,NULL),('c',11,'P'),('c',12,'N'),('c',13,'N'),('c',14,'N'),
('d',15, 'P'),('d',16, NULL),('d',17,NULL),('d',18,'P'),('d',19,'N')
SELECT *,
CASE WHEN Val IS NULL
THEN (SELECT TOP 1 Val FROM @Table WHERE ID<T.ID AND G=T.G AND Val IS NOT NULL ORDER BY ID DESC)
ELSE Val END AS NewVal
FROM @Table T
ORDER BY G, ID
使用LAG/LEADと@dfundakoが言うように、あなたは、上のパーティショニングとLAG/LEADの簡単な使用この – dfundako
を行うことができるはず " G 'カラムは、例の最後のケースを除いて、良いでしょう。複数のNULLが連続しています... – smj
LAG/LEAD非常に興味深い関数について知りませんでした。 – user918967