2015-11-18 43 views
0

我想知道什麼是最簡單的方法來填充時間軸中的記錄與過去的最後一個可用值 - 直到它發生變化?SQL Server:如何填充基於邊界值的時間軸記錄

snapshot val 
---------------- 
201201 NULL 
201202 NULL 
201203 10 
201204 NULL 
201405 NULL 
201406 20 
201407 30 
201408 NULL 
201409 NULL 
201410 NULL 
201411 NULL 
201412 40 
201501 NULL 
... 

預期然後輸出將是:

snapshot val 
--------------- 
201201 NULL 
201202 NULL 
201203 10 
201204 10 
201405 10 
201406 20 
201407 30 
201408 30 
201409 30 
201410 30 
201411 30 
201412 40 
201501 40 
+0

你使用的是什麼版本的sql server?答案更改與SQL 2012. –

+0

哪個版本的SQL Server? –

+0

我正在使用SQL 2012傢伙。 – bazinac

回答

3

SqlFiddle Demo

SELECT [snapshot], 
     [val], 
     MAX([val]) OVER (PARTITION BY grp ORDER BY [snapshot]) as [val], 
     grp 
FROM (       
     SELECT [snapshot], 
      [val], 
      COUNT([val]) OVER (ORDER BY [snapshot]) grp  
     FROM YourTable 
) T 

OUTPUT

| snapshot | val | val | grp | 
|----------|--------|--------|-----| 
| 201201 | (null) | (null) | 0 | 
| 201202 | (null) | (null) | 0 | 
| 201203 |  10 |  10 | 1 | 
| 201204 | (null) |  10 | 1 | 
| 201405 | (null) |  10 | 1 | 
| 201406 |  20 |  20 | 2 | 
| 201407 |  30 |  30 | 3 | 
| 201408 | (null) |  30 | 3 | 
| 201409 | (null) |  30 | 3 | 
| 201410 | (null) |  30 | 3 | 
| 201411 | (null) |  30 | 3 | 
| 201412 |  40 |  40 | 4 | 
| 201501 | (null) |  40 | 4 |