2017-07-28 11 views
-3

出力をこのようにしたいと思います。LAG関数のインクリメントを停止する

これを行うために遅延機能を使用する方法はありますか?

ID1  Column1 

NULL  NULL 
NULL  NULL 
2017  2017 
NULL  2017 
NULL  2017 
NULL  2017 
NULL  2017 
NULL  NULL 
NULL  NULL  
2048  2048 
NULL  2048 
NULL  2048 
2098  2098 
NULL  2098 
NULL  2098 
NULL  2098 
+2

あなたは手の込んだことができますか?サンプルデータや期待される結果が十分ではありません。 – scsimon

+0

カラム2が望ましい結果である場合、カラム1に基づいて計算される方法が完全に不明です。なぜ2017グループがNULLになるのですか?どの列が注文を表していますか? –

+0

私はColumn1で新しい値を取得し、プロセスを繰り返すまで、Column2のColumn1の値を下げたいと思います。 – AllisonCoder

答えて

0

さて、あなたはそれ以外の場合はLEADLAGが同期して得ることができる...順序を示して別の列を必要とします。それは言われていると、あなたがNULLを打つまで、無制限の以前のすべての行を見て必要があるだろう、ここで私が「サブクエリで簡単な方法

declare @table table (ID int identity(1,1), Column1 int) 
insert into @table 
values 
(NULL), 
(NULL), 
(2017), 
(NULL), 
(NULL), 
(NULL), 
(2048), 
(NULL), 
(NULL), 
(NULL), 
(NULL), 
(2098) 


SELECT 
    ID 
    ,Column1 
    ,ISNULL(Column1, (SELECT TOP 1 Column1 FROM @Table WHERE ID < t.ID AND Column1 IS NOT NULL ORDER BY ID DESC)) as Column2 
FROM 
    @Table t 

RETURNS

+----+---------+---------+ 
| ID | Column1 | Column2 | 
+----+---------+---------+ 
| 1 | NULL | NULL | 
| 2 | NULL | NULL | 
| 3 | 2017 | 2017 | 
| 4 | NULL | 2017 | 
| 5 | NULL | 2017 | 
| 6 | NULL | 2017 | 
| 7 | 2048 | 2048 | 
| 8 | NULL | 2048 | 
| 9 | NULL | 2048 | 
| 10 | NULL | 2048 | 
| 11 | NULL | 2048 | 
| 12 | 2098 | 2098 | 
+----+---------+---------+ 
+0

ありがとうございましたが、それでもColumn1で1ずつ増加しています。値が何千もの行全体にわたって同じままである行を複製するためにとにかくありますか? – AllisonCoder

+0

Column1で1ずつインクリメントしています。期待される結果は何でしょうか?新しい非null値をヒットするまで、Column1の値を必要としていると述べました。それはまさにこれがすることです。 – scsimon

+0

@AllisonCoderここでテストを確認してくださいhttp://rextester.com/MCDCX97880あなたは何を間違っているのか分かりません。私のコードは期待どおりに動作します。 – scsimon

2

ですあなたはLAST_VALUEIGNORE NULLSをシミュレートしようとしています。

希望する結果が正しくない場合。あなたが行うことができます

demo - borrows scsimon's data

SELECT 
    ID 
    ,Column1 
    ,0 + LEFT(MAX(ID_Column1) OVER (ORDER BY ID),10) AS LagID 
    ,0 + RIGHT(MAX(ID_Column1) OVER (ORDER BY ID),10) AS LagColumn1 
FROM 
    @Table t 
CROSS APPLY (VALUES (FORMAT(ID,'D10') + FORMAT(Column1,'D10'))) V(ID_Column1); 
+0

ありがとうございます。しかし、エイリアスを使わずにこれを行う方法はありますか? – AllisonCoder

関連する問題